From 56b6f48a7b6b14a4f49efeebb49c67a9bf1ad70d Mon Sep 17 00:00:00 2001 From: James Maes Date: Thu, 15 Oct 2026 01:33:09 -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-slack.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 | 3 ++ pom.xml | 11 +++++++ .../qbits/slack/SlackQBitProducer.java | 33 ++++++++++++++++++- src/main/resources/qbit-slack.properties | 1 + .../qbits/slack/SlackQBitProducerTest.java | 2 ++ .../qbits/slack/SlackTablesGuardrailTest.java | 2 ++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/qbit-slack.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 293f957..5d7dc82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- QBit metadata now reports the Maven artifact version, including release versions, from a filtered properties resource. + ### Added - Complete host-neutral in-app help bundle with live labels and core `HelpBundleAssertions` coverage; registered through QQQ 4.1.0-RC.7 `HelpBundles`, replacing the temporary loader. - "Check channels" action on Registered Channels; readiness now writes the channel's Slack name, private, bot is member, archived, purpose and checked time back to the row. diff --git a/pom.xml b/pom.xml index b2376f3..8d01b73 100644 --- a/pom.xml +++ b/pom.xml @@ -127,6 +127,7 @@ true help/*.yaml + qbit-slack.properties @@ -134,10 +135,20 @@ false help/*.yaml + qbit-slack.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/slack/SlackQBitProducer.java b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java index d249279..2334439 100644 --- a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java +++ b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java @@ -21,8 +21,11 @@ package com.kingsrook.qbits.slack; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import com.kingsrook.qbits.slack.bridge.SlackOutboxMessagingProviderMetaData; import com.kingsrook.qbits.slack.delivery.SlackAlerts; import com.kingsrook.qbits.slack.metadata.SlackTables; @@ -43,13 +46,41 @@ public class SlackQBitProducer implements QBitMetaDataProducer { public static final String GROUP_ID = "com.kingsrook.qbits"; public static final String ARTIFACT_ID = "qbit-slack"; - public static final String VERSION = "0.1.0"; + public static final String VERSION = loadVersion(); private SlackQBitConfig qBitConfig; private String namespace; + /******************************************************************************* + ** Read the artifact version from the Maven-filtered properties resource. + *******************************************************************************/ + private static String loadVersion() + { + try(InputStream inputStream = SlackQBitProducer.class.getClassLoader().getResourceAsStream("qbit-slack.properties")) + { + if(inputStream == null) + { + throw (new IllegalStateException("Missing qbit-slack.properties; build with Maven to supply 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-slack.properties; build with Maven")); + } + return (version); + } + catch(IOException e) + { + throw (new IllegalStateException("Could not read artifact version from qbit-slack.properties", e)); + } + } + + + /******************************************************************************* ** Fluent setter for the config. *******************************************************************************/ diff --git a/src/main/resources/qbit-slack.properties b/src/main/resources/qbit-slack.properties new file mode 100644 index 0000000..defbd48 --- /dev/null +++ b/src/main/resources/qbit-slack.properties @@ -0,0 +1 @@ +version=${project.version} diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java index 6632b41..14a2298 100644 --- a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java +++ b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java @@ -45,6 +45,8 @@ class SlackQBitProducerTest SlackQBitProducer producer = new SlackQBitProducer().withQBitConfig(config).withNamespace("ns"); QBitMetaData metaData = producer.getQBitMetaData(); + assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank(); + assertThat(metaData.getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION); assertThat(metaData.getArtifactId()).isEqualTo("qbit-slack"); assertThat(metaData.getGroupId()).isEqualTo("com.kingsrook.qbits"); assertThat(producer.getNamespace()).isEqualTo("ns"); diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java index d458e69..7f0c775 100644 --- a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java +++ b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java @@ -160,6 +160,8 @@ class SlackTablesGuardrailTest var bundles = HelpBundles.of(instance).getBundles(); assertThat(bundles).hasSize(1); assertThat(bundles.get(0).getId()).isEqualTo("qbit-slack"); + assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank(); + assertThat(bundles.get(0).getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION); for(String table : SlackTables.ALL) { assertThat(bundles.get(0).getEntries()).filteredOn(entry -> entry.getKey().equals("table:" + table + ";slot:help")) -- 2.54.0