Added support for mustache instead of Velocity.

This commit is contained in:
Erik C. Thauvin 2017-04-14 22:27:07 -07:00
parent 13dec4f063
commit 5efb2a9e1d
10 changed files with 199 additions and 133 deletions

8
.gitignore vendored
View file

@ -4,8 +4,8 @@
**/.idea/tasks.xml
**/.idea/workspace.xml
*.iws
.DS_Store
.classpath
.DS_Store
.gradle
.kobalt
.nb-gradle
@ -17,12 +17,14 @@
/dist
/gen
/gradle.properties
/lib/kotlin*
/libs
/local.properties
/out
/proguard-project.txt
/project.properties
/target
/test-output
Thumbs.db
ehthumbs.db
kobaltBuild
kobaltBuild
Thumbs.db

View file

@ -59,7 +59,7 @@ repositories {
}
dependencies {
compile 'org.apache.velocity:velocity:1.7'
compile 'com.github.spullara.mustache.java:compiler:0.9.4'
testCompile 'org.testng:testng:6.11'
}

View file

@ -43,10 +43,23 @@ public final class Constants {
* The default class name.
*/
public static final String DEFAULT_CLASS_NAME = "GeneratedVersion";
/**
* The default mustache template.
*/
public static final String DEFAULT_TEMPLATE = "version.mustache";
/**
* /**
* The default Java mustache template.
*/
public static final String DEFAULT_JAVA_TEMPLATE = "semver.mustache";
/**
* The default java type.
**/
public static final String DEFAULT_JAVA_TYPE = "java";
/**
* The default Kotlin mustache template.
*/
public static final String DEFAULT_KOTLIN_TEMPLATE = "semver-kt.mustache";
/**
* The default major version.
*/
@ -59,14 +72,11 @@ public final class Constants {
* The default patch version.
*/
public static final int DEFAULT_PATCH = 0;
/**
* The default Velocity template.
*/
public static final String DEFAULT_TEMPLATE = "version.vm";
/**
* The empty string.
*/
public static final String EMPTY = "";
/**
* The build metadata property key.
*/
@ -95,10 +105,6 @@ public final class Constants {
* The kotlin type.
*/
public static final String KOTLIN_TYPE = "kt";
/**
* The velocity properties name.
*/
public static final String VELOCITY_PROPERTIES = "velocity.properties";
/**
* Disables the default constructor.

View file

@ -74,7 +74,7 @@ public @interface Version {
String properties() default Constants.EMPTY;
String template() default Constants.DEFAULT_TEMPLATE;
String template() default Constants.DEFAULT_JAVA_TEMPLATE;
String type() default Constants.DEFAULT_JAVA_TYPE;
}

View file

@ -41,18 +41,16 @@ package net.thauvin.erik.semver;
public class VersionInfo {
private final long epoch = System.currentTimeMillis();
private String buildmeta;
private String buildMeta;
private String className;
private int major;
private int minor;
private String packageName;
private int patch;
private String prerelease;
private String preRelease;
private String project;
/**
* Creates a new object with default values
*/
@ -60,9 +58,11 @@ public class VersionInfo {
major = Constants.DEFAULT_MAJOR;
minor = Constants.DEFAULT_MINOR;
patch = Constants.DEFAULT_PATCH;
buildmeta = Constants.EMPTY;
prerelease = Constants.EMPTY;
buildMeta = Constants.EMPTY;
preRelease = Constants.EMPTY;
project = Constants.EMPTY;
className = Constants.DEFAULT_CLASS_NAME;
packageName = Constants.EMPTY;
}
/**
@ -74,9 +74,10 @@ public class VersionInfo {
major = version.major();
minor = version.minor();
patch = version.patch();
buildmeta = version.buildmeta();
prerelease = version.prerelease();
buildMeta = version.buildmeta();
preRelease = version.prerelease();
project = version.project();
className = version.className();
}
/**
@ -84,17 +85,35 @@ public class VersionInfo {
*
* @return The build metadata.
*/
public String getBuildMetadata() {
return buildmeta;
public String getBuildMeta() {
return buildMeta;
}
/**
* Sets the build metadata.
*
* @param buildmeta The new build metadata.
* @param buildMeta The new build metadata.
*/
public void setBuildMetadata(final String buildmeta) {
this.buildmeta = buildmeta;
public void setBuildMeta(final String buildMeta) {
this.buildMeta = buildMeta;
}
/**
* Returns the class name.
*
* @return The class name.
*/
public String getClassName() {
return className;
}
/**
* Sets the class name.
*
* @param className The new class name.
*/
public void setClassName(String className) {
this.className = className;
}
/**
@ -142,6 +161,24 @@ public class VersionInfo {
this.minor = minor;
}
/**
* Returns the package name.
*
* @return The package name.
*/
public String getPackageName() {
return packageName;
}
/**
* Sets the package name version.
*
* @param packageName The new patch version.
*/
public void setPackageName(String packageName) {
this.packageName = packageName;
}
/**
* Returns the patch version.
*
@ -166,16 +203,16 @@ public class VersionInfo {
* @return The pre-release version.
*/
public String getPreRelease() {
return prerelease;
return preRelease;
}
/**
* Sets the pre-release version.
*
* @param prerelease The new pre-release version.
* @param preRelease The new pre-release version.
*/
public void setPreRelease(final String prerelease) {
this.prerelease = prerelease;
public void setPreRelease(final String preRelease) {
this.preRelease = preRelease;
}
/**
@ -218,7 +255,7 @@ public class VersionInfo {
+ Integer.toString(minor)
+ '.'
+ Integer.toString(patch)
+ (prerelease.length() > 0 ? '-' + prerelease : "")
+ (buildmeta.length() > 0 ? '+' + buildmeta : "");
+ (preRelease.length() > 0 ? '-' + preRelease : "")
+ (buildMeta.length() > 0 ? '+' + buildMeta : "");
}
}

View file

@ -31,9 +31,9 @@
*/
package net.thauvin.erik.semver;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import com.github.mustachejava.DefaultMustacheFactory;
import com.github.mustachejava.Mustache;
import com.github.mustachejava.MustacheFactory;
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
@ -45,7 +45,6 @@ import javax.tools.Diagnostic;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.*;
import java.net.URL;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
@ -89,7 +88,7 @@ public class VersionProcessor extends AbstractProcessor {
versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR));
versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR));
versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH));
versionInfo.setBuildMetadata(p.getProperty(version.buildmetaKey(), Constants.EMPTY));
versionInfo.setBuildMeta(p.getProperty(version.buildmetaKey(), Constants.EMPTY));
versionInfo.setPreRelease(p.getProperty(version.prereleaseKey(), Constants.EMPTY));
}
} else {
@ -161,12 +160,19 @@ public class VersionProcessor extends AbstractProcessor {
final PackageElement packageElement = (PackageElement) enclosingElement;
try {
final VersionInfo versionInfo = findValues(version);
versionInfo.setPackageName(packageElement.getQualifiedName().toString());
note("Found version: " + versionInfo.getVersion());
writeTemplate(version.type(),
packageElement.getQualifiedName().toString(),
version.className(),
versionInfo,
version.template());
final String template;
if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) &&
new File(Constants.DEFAULT_TEMPLATE).exists()) {
template = Constants.DEFAULT_TEMPLATE;
} else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) &&
version.type().equals(Constants.KOTLIN_TYPE)) {
template = Constants.DEFAULT_KOTLIN_TEMPLATE;
} else {
template = version.template();
}
writeTemplate(version.type(), versionInfo, template);
} catch (IOException e) {
error("IOException occurred while running the annotation processor", e);
}
@ -180,51 +186,26 @@ public class VersionProcessor extends AbstractProcessor {
log(Diagnostic.Kind.WARNING, s);
}
private void writeTemplate(final String type,
final String packageName,
final String className,
final VersionInfo versionInfo,
final String template)
private void writeTemplate(final String type, final VersionInfo versionInfo, final String template)
throws IOException {
final Properties p = new Properties();
final URL url = this.getClass().getClassLoader().getResource(Constants.VELOCITY_PROPERTIES);
final MustacheFactory mf = new DefaultMustacheFactory();
final Mustache mustache = mf.compile(template);
if (url != null) {
p.load(url.openStream());
note("Loaded template: " + mustache.getName());
final VelocityEngine ve = new VelocityEngine(p);
ve.init();
final VelocityContext vc = new VelocityContext();
vc.put("packageName", packageName);
vc.put("className", className);
vc.put("project", versionInfo.getProject());
vc.put("buildmeta", versionInfo.getBuildMetadata());
vc.put("epoch", versionInfo.getEpoch());
vc.put("patch", versionInfo.getPatch());
vc.put("major", versionInfo.getMajor());
vc.put("minor", versionInfo.getMinor());
vc.put("prerelease", versionInfo.getPreRelease());
final Template vt = ve.getTemplate(template);
note("Loaded template: " + vt.getName());
final FileObject jfo;
if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) {
jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, packageName,
className + '.' + type);
} else {
jfo = filer.createSourceFile(packageName + '.' + className);
}
try (final Writer writer = jfo.openWriter()) {
vt.merge(vc, writer);
}
note("Generated source: " + jfo.getName());
final FileObject jfo;
if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) {
jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, versionInfo.getPackageName(),
versionInfo.getClassName() + '.' + type);
} else {
error("Could not load '" + Constants.VELOCITY_PROPERTIES + "' from jar.");
jfo = filer.createSourceFile(versionInfo.getPackageName() + '.' + versionInfo.getClassName());
}
try (final Writer writer = jfo.openWriter()) {
mustache.execute(writer, versionInfo).flush();
}
note("Generated source: " + jfo.getName());
}
}

View file

@ -0,0 +1,46 @@
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
package {{packageName}}
import java.util.*
/**
* Provides semantic version information.
*
* @author <a href="https://github.com/ethauvin/semver">Semantic Version
* Annotation Processor</a>
*/
open class {{className}}
private constructor() {
companion object {
val project = "{{project}}"
val buildDate = Date({{epoch}}L)
val major = {{major}}
val minor = {{minor}}
val patch = {{patch}}
val buildMeta = "{{buildMeta}}"
val preRelease = "{{preRelease}}"
val version: String
get() = ("$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix())
fun preReleaseWithPrefix(prefix: String = "-"): String {
return if (preRelease.isNotEmpty() && prefix.isNotEmpty()) {
"$prefix$preRelease"
} else {
preRelease
}
}
fun buildMetaWithPrefix(prefix: String = "+"): String {
return if (buildMeta.isNotEmpty() && prefix.isNotEmpty()) {
"$prefix$buildMeta"
} else {
buildMeta
}
}
}
}

View file

@ -1,23 +1,8 @@
##############################################################################
##
## Available variables:
##
## $packageName - The package name. (string)
## $className - The class name. (string)
## $project - The project name. (string)
## $epoch - The build epoch/unix time. (long)
## $major - The major version. (int)
## $minor - The minor version. (int)
## $patch - The patch version. (int)
## $prerelease - The pre-release version. (string)
## $buildmeta - The build metadata version. (string)
##
##############################################################################
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
package ${packageName};
package {{packageName}};
import java.util.Date;
@ -27,25 +12,26 @@ import java.util.Date;
* @author <a href="https://github.com/ethauvin/semver">Semantic Version
* Annotation Processor</a>
*/
public final class ${className} {
public final class {{className}} {
private final static String DEFAULT_PRERELEASE_PREFIX = "-";
private final static string DEFAULT_BUILDMETA_PREFIX = "+";
private final static String buildmeta = "${buildmeta}";
private final static Date date = new Date(${epoch}L);
private final static int major = ${major};
private final static int minor = ${minor};
private final static int patch = ${patch};
private final static String prerelease = "${prerelease}";
private final static String project = "${project}";
private final static String project = "{{project}}";
private final static Date date = new Date({{epoch}}L);
private final static int major = {{major}};
private final static int minor = {{minor}};
private final static int patch = {{patch}};
private final static String preRelease = "{{preRelease}}";
private final static String buildMeta = "{{buildMeta}}";
/**
* Disables the default constructor.
*
* @throws UnsupportedOperationException If the constructor is called.
*/
private ${className}()
throws UnsupportedOperationException {
private {{className}}()
throws UnsupportedOperationException {
throw new UnsupportedOperationException("Illegal constructor call.");
}
@ -87,9 +73,9 @@ public final class ${className} {
*/
public static String getVersion() {
return Integer.toString(getMajor()) + '.'
+ Integer.toString(getMinor()) + '.'
+ Integer.toString(getPatch())
+ getPreReleaseWithPrefix + getBuildMetadataWithPrefix;
+ Integer.toString(getMinor()) + '.'
+ Integer.toString(getPatch())
+ getPreReleaseWithPrefix + getBuildMetaWithPrefix;
}
/**
@ -125,7 +111,7 @@ public final class ${className} {
* @return The pre-release version, if any
*/
public static int getPreRelease() {
return prerelease;
return preRelease;
}
/**
@ -133,8 +119,8 @@ public final class ${className} {
*
* @return The build metadata, if any.
*/
public static String getBuildMetadata() {
return buildmeta;
public static String getBuildMeta() {
return buildMeta;
}
/**
@ -149,14 +135,14 @@ public final class ${className} {
/**
* Returns the pre-release version.
*
* @param prefix The refix to prepend.
* @param prefix The prefix to prepend.
* @return The pre-release version, if any.
*/
public static String getPreReleaseWithPrefix(final String prefix) {
if (prerelease.length() > 0 && prefix.length() > 0) {
return prefix + prerelease;
if (preRelease.length() > 0 && prefix.length() > 0) {
return prefix + preRelease;
} else {
return prerelease;
return preRelease;
}
}
@ -166,8 +152,8 @@ public final class ${className} {
* @param prefix The prefix to prepend.
* @return The build metadata, if any.
*/
public static String getBuildMetadataWithPrefix() {
return getBuildMetadataWithPrefix(DEFAULT_PRERELEASE_PREFIX);
public static String getBuildMetaWithPrefix() {
return getBuildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX);
}
/**
@ -176,11 +162,11 @@ public final class ${className} {
* @param prefix Prefix to prepend.
* @return The build metadata, if any.
*/
public static String getBuildMetadataWithPrefix(final String prefix) {
if (buildmeta.length() > 0 && prefix.length() > 0) {
return prefix + buildmeta;
public static String getBuildMetaWithPrefix(final String prefix) {
if (buildMeta.length() > 0 && prefix.length() > 0) {
return prefix + buildMeta;
} else {
return buildmeta;
return buildMeta;
}
}
}

View file

@ -1,4 +0,0 @@
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute
resource.loader = file, class
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

View file

@ -68,12 +68,24 @@ public class VersionInfoTest
Assert.assertEquals(version.getVersion(), "3.2.1-beta");
version.setBuildMetadata("001");
version.setBuildMeta("001");
Assert.assertEquals(version.getVersion(), "3.2.1-beta+001");
version.setPreRelease("");
Assert.assertEquals(version.getVersion(), "3.2.1+001");
version.setPackageName("com.example");
Assert.assertEquals(version.getPackageName(), "com.example");
version.setProject("Example");
Assert.assertEquals(version.getProject(), "Example");
version.setClassName("Example");
Assert.assertEquals(version.getClassName(), "Example");
}
}