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 @@
-
+