From 50f31a9040ef808dc72cb68f01f5b407f1aa49d7 Mon Sep 17 00:00:00 2001 From: James Maes Date: Thu, 15 Oct 2026 01:24:08 -0500 Subject: [PATCH] fix: the qbit metadata version comes from the build, not a hardcoded constant The producer read a literal version, so released artifacts reported a stale or -SNAPSHOT version. qbit-email.properties (version=${project.version}) is Maven-filtered and the producer loads it; tests assert producer == bundle == artifact version. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 1 + pom.xml | 11 +++++++ .../qbits/email/EmailQBitProducer.java | 33 ++++++++++++++++++- src/main/resources/qbit-email.properties | 1 + .../qbits/email/EmailQBitProducerTest.java | 6 +++- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/qbit-email.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cb1fee..aec729d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and - `EmailTablesGuardrailTest`: every table is used by runtime code, seeded or listed as starting empty with a reason, and has help. ### Fixed +- Derive the qbit metadata version from the Maven artifact version so released artifacts report their release version. - `email_template.ownerQbit` was stored but never read, and the built-in template did not set it. The built-in now names `qbit-email`, the field is read-only with help, and messages sent from a template name its owner qbit as `senderQbit` unless the request names one. ### Added diff --git a/pom.xml b/pom.xml index e819271..127ccd4 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,7 @@ true help/*.yaml + qbit-email.properties @@ -182,10 +183,20 @@ false help/*.yaml + qbit-email.properties + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.version} + + + org.apache.maven.plugins maven-checkstyle-plugin diff --git a/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java b/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java index 7d0ea4b..13b552e 100644 --- a/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java +++ b/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java @@ -21,10 +21,13 @@ package com.kingsrook.qbits.email; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import com.kingsrook.qbits.email.app.EmailApp; import com.kingsrook.qbits.email.bridge.EmailOutboxMessagingProviderMetaData; import com.kingsrook.qbits.email.delivery.EmailAlerts; @@ -53,13 +56,41 @@ public class EmailQBitProducer implements QBitMetaDataProducer { public static final String GROUP_ID = "com.kingsrook.qbits"; public static final String ARTIFACT_ID = "qbit-email"; - public static final String VERSION = "0.1.0"; + public static final String VERSION = loadVersion(); private EmailQBitConfig qBitConfig; private String namespace; + /******************************************************************************* + ** Read the artifact version from the Maven-filtered resource. + *******************************************************************************/ + private static String loadVersion() + { + try(InputStream inputStream = EmailQBitProducer.class.getClassLoader().getResourceAsStream("qbit-email.properties")) + { + if(inputStream == null) + { + throw new IllegalStateException("Missing qbit-email.properties; build with Maven to generate the artifact version"); + } + Properties properties = new Properties(); + properties.load(inputStream); + String version = properties.getProperty("version"); + if(version == null || version.isBlank() || version.contains("${")) + { + throw new IllegalStateException("Missing or unfiltered version in qbit-email.properties; build with Maven"); + } + return (version); + } + catch(IOException e) + { + throw new IllegalStateException("Could not read artifact version from qbit-email.properties", e); + } + } + + + /******************************************************************************* ** Fluent setter for the config. *******************************************************************************/ diff --git a/src/main/resources/qbit-email.properties b/src/main/resources/qbit-email.properties new file mode 100644 index 0000000..defbd48 --- /dev/null +++ b/src/main/resources/qbit-email.properties @@ -0,0 +1 @@ +version=${project.version} diff --git a/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java index 406748b..bf0aceb 100644 --- a/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java +++ b/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java @@ -48,13 +48,17 @@ class EmailQBitProducerTest assertThat(producer.isEnabled()).isTrue(); assertThat(producer.getNamespace()).isNull(); assertThat(producer.getQBitConfig().getBackendName()).isEqualTo("memory"); + String artifactVersion = System.getProperty("qbit.artifactVersion"); + assertThat(artifactVersion).isNotBlank(); + assertThat(EmailQBitProducer.VERSION).isEqualTo(artifactVersion); + assertThat(producer.getQBitMetaData().getVersion()).isEqualTo(artifactVersion); assertThat(producer.produce(instance)).isNotNull(); assertThat(instance.getQBits()).isNotEmpty(); assertThat(instance.getTable("helpContent")).isNull(); assertThat(HelpBundles.of(instance).getBundles()).singleElement().satisfies(bundle -> { assertThat(bundle.getId()).isEqualTo("qbit-email"); - assertThat(bundle.getVersion()).matches("\\d+\\.\\d+\\.\\d+(-SNAPSHOT|-RC\\.\\d+)?"); + assertThat(bundle.getVersion()).isEqualTo(artifactVersion).isEqualTo(EmailQBitProducer.VERSION); }); } -- 2.54.0