diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0d6135 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# Semantic Version Annotation Processor + +An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `Version` class 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). + +This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor). + +## Examples + +* Using annotation elements: + + ```java + @Version(major = 1, minor = 0, patch = 0, prerelease = "beta") + public class A { + // ... + ``` + +* Or using a [properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file: + + ```java + @Version(properties = "version.properties") + public class A { + // ... + ``` + + and `version.properties` containing: + + ```ini +version.major=1 +version.minor=0 +version.patch=0 +version.prerelease=beta +``` + +## Template + +Upon running the annotator processor, a source file `GeneratedVersion.java` is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Velocity](http://velocity.apache.org/) template. + +```java +@Version(template = "myversion.vm") +public class A { +// ... +``` + +The [default template]() implements the following static methods: + +Method | Description | Example +------------------|----------------------------------|------------------ +`getProject` | The project name, if any. | `MyProject` +`getBuildDate` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) +`getVersion` | The full version string. | `1.0.0-alpha+001` +`getMajor` | The major version. | `1` +`getMinor` | The minor version. | `0` +`getPatch` | The patch version. | `0` +`getPreRelease` | The pre-release version, if any. | `alpha` +`getBuildMetadata`| The build metadata, if any. | `001` + +## Elements & Properties + +The following annotation elements and properties are available: + +Element | Property | Description | Default +-------------|----------------------|----------------------------------|------------- +`project` | `version.project` | The project name. | +`major` | `version.major` | The major version number. | `1` +`minor` | `version.major` | The minor version number. | `0` +`patch` | `version.patch` | The patch version number. | `0` +`prerelease` | `version.prerelease` | The pre-release version. | +`buildmeta` | `version.buildmeta` | The build metadata version. | +`className` | | The name of the generated class. | `GeneratedVersion` +`properties` | | The properties file. | +`template` | | The template file. | `version.vm` + +In order to easily incorporate with existing projects, the property keys may be assigned custom values: + +```java +@Version( + properties = "example.properties", + majorKey = "example.major", + minorKey = "example.minor", + patchKey = "example.patch", + prereleaseKey = "example.prerelease", + buildmetaKey = "example.buildmeta", + projectKey = "example.project" +) +public class Example { +// ... +``` + +with `example.properties` containing: + +```ini +example.project=Example +example.major=1 +example.minor=0 +example.patch=0 +... +``` \ No newline at end of file diff --git a/build.gradle b/build.gradle index a872926..92b7bab 100644 --- a/build.gradle +++ b/build.gradle @@ -4,13 +4,36 @@ apply plugin: 'maven' defaultTasks 'deploy' -version = '1.0' +def getVersion(isIncrement = false) +{ + def propsFile = 'version.properties' + def majorKey = 'version.major' + def minorKey = 'version.minor' + def patchKey = 'version.patch' + def metaKey = 'version.buildmeta' + def preKey = 'version.prerelease' + if (isIncrement) + { + ant.propertyfile(file: propsFile) { + entry(key: patchKey, + type: 'int', + default: '-1', + operation: '+') + } + } + def p = new Properties() + file(propsFile).withInputStream { stream -> p.load(stream) } + def metadata = p.getProperty(metaKey, '') + def prerelease = p.getProperty(preKey, '') + return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + + (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) +} + +version = getVersion() def deployDir = 'deploy' def isRelease = 'release' in gradle.startParameter.taskNames def mavenGroupId = 'net.thauvin.erik' -//def buildProps = 'buildnumber.properties' -//def buildProp = 'build' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' @@ -29,31 +52,9 @@ test { } compileJava { - /* doFirst { - if (isRelease) - { - ant.propertyfile(file: buildProps) { - entry(key: buildProp, - type: 'int', - default: '-1', - operation: '+') - } - } + project.version = getVersion(isRelease) } - */ -} - - -jar { - /* - doFirst { - def props = new Properties() - file(buildProps).withInputStream { stream -> props.load(stream) } - project.version = version + '.' + props.get(buildProp) - } - */ - archiveName = archiveName.toLowerCase() } clean { @@ -61,17 +62,13 @@ clean { } task copyToDeploy(type: Copy) { - from(configurations.runtime) { - exclude 'servlet-api-*.jar' - exclude 'jsp-api-*.jar' - } from jar into deployDir } task deploy(dependsOn: ['build', 'copyToDeploy']) { - description = "Copies all needed files to the ${deployDir} directory." - group = "Publishing" + description = 'Copies all needed files to the ${deployDir} directory.' + group = 'Publishing' outputs.dir deployDir inputs.files copyToDeploy mustRunAfter clean @@ -81,7 +78,7 @@ uploadArchives { repositories { mavenDeployer { repository(url: mavenLocal().url) - pom.artifactId = rootProject.name.toLowerCase() + pom.artifactId = rootProject.name pom.groupId = mavenGroupId } } @@ -91,8 +88,8 @@ task wrapper(type: Wrapper) { gradleVersion = gradle.gradleVersion } -task release(dependsOn: ['deploy', 'wrapper', 'uploadArchives']) { - group = "Publishing" - description = "Releases new version." +task release(dependsOn: ['deploy', 'wrapper', 'uploadArchives']) << { + group = 'Publishing' + description = 'Releases new version.' isRelease = true } \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index 97d7c03..ea8ebb3 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -13,15 +13,15 @@ def deployDir = 'deploy' def getVersion(isIncrement = false) { def propsFile = 'version.properties' - def majorProp = 'version.major' - def minorProp = 'version.minor' - def patchProp = 'version.patch' - def metaProp = 'version.buildmeta' - def preProp = 'version.prerelease' + def majorKey = 'version.major' + def minorKey = 'version.minor' + def patchKey = 'version.patch' + def metaKey = 'version.buildmeta' + def preKey = 'version.prerelease' if (isIncrement) { ant.propertyfile(file: propsFile) { - entry(key: patchProp, + entry(key: patchKey, type: 'int', default: '-1', operation: '+') @@ -29,9 +29,9 @@ def getVersion(isIncrement = false) } def p = new Properties() file(propsFile).withInputStream { stream -> p.load(stream) } - def metadata = p.getProperty(metaProp, '') - def prerelease = p.getProperty(preProp, '') - return (p.getProperty(majorProp, '1') + '.' + p.getProperty(minorProp, '0') + '.' + p.getProperty(patchProp, '0') + + def metadata = p.getProperty(metaKey, '') + def prerelease = p.getProperty(preKey, '') + return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) } @@ -46,17 +46,17 @@ repositories { } dependencies { - compile "net.thauvin.erik:semver:+" + compile 'net.thauvin.erik:semver:+' } annotationProcessor { project.version = getVersion(isRelease) - library "net.thauvin.erik:semver:+" - processor "net.thauvin.erik.semver.VersionProcessor" + library 'net.thauvin.erik:semver:+' + processor 'net.thauvin.erik.semver.VersionProcessor' } compileJava { - options.compilerArgs << "-proc:none" + options.compilerArgs << '-proc:none' } jar { @@ -74,17 +74,17 @@ task copyToDeploy(type: Copy) { } task deploy(dependsOn: ['build', 'copyToDeploy']) { - description = "Copies all needed files to the ${deployDir} directory." - group = "Publishing" + description = 'Copies all needed files to the ${deployDir} directory.' + group = 'Publishing' outputs.dir deployDir inputs.files copyToDeploy mustRunAfter clean } -task release(dependsOn: ['deploy', 'wrapper']) { - group = "Publishing" - description = "Releases new version." +task release(dependsOn: ['deploy', 'wrapper']) << { + group = 'Publishing' + description = 'Releases new version.' isRelease = true } diff --git a/example/example.iml b/example/example.iml index 6f7fa8e..fca0b58 100644 --- a/example/example.iml +++ b/example/example.iml @@ -16,10 +16,10 @@ - +