diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 7072f32..7b40be3 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -48,7 +48,7 @@ jobs: - uses: actions/setup-java@v5 with: distribution: temurin - java-version: "21" + java-version: "25" - name: Confirm Docker run: docker info diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2199715..81d647f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-java@v5 with: distribution: temurin - java-version: "21" + java-version: "25" - uses: gradle/actions/setup-gradle@v6 with: gradle-version: wrapper @@ -73,7 +73,7 @@ jobs: - uses: actions/setup-java@v5 with: distribution: temurin - java-version: "21" + java-version: "25" - uses: gradle/actions/setup-gradle@v6 with: gradle-version: wrapper diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 07ad068..928ee08 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ on: release_version: description: "Java release version. Rust and VS Code use the base semver for alpha." required: true - default: "0.1.0-alpha.2" + default: "0.1.0-alpha.3" publish_java: description: "Publish Java artifacts to Maven Central." required: true @@ -79,7 +79,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: temurin - java-version: 21 + java-version: 25 - name: Setup Gradle uses: gradle/actions/setup-gradle@v6 @@ -186,7 +186,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: temurin - java-version: 21 + java-version: 25 - name: Setup Gradle uses: gradle/actions/setup-gradle@v6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 97d4b59..2935819 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ Mortar follows semantic versioning after the first public release. Before `1.0.0 ## Unreleased +## 0.1.0-alpha.3 - 2026-06-23 + +- Certified the Spring Boot starter against Spring Boot 4.1.0 and Spring + Framework 7.0.8. +- Raised the Java toolchain and processor source-version target to Java 25. +- Added Foojay toolchain provisioning so Gradle can resolve the Java 25 + toolchain when it is not already installed locally. +- Updated the Spring Boot example and public compatibility docs for the + 4.1.x platform line. + ## 0.1.0-alpha.2 - 2026-06-23 - Added a VS Code package contract check so VSIX builds fail if source files, diff --git a/README.md b/README.md index f47e357..62dd0b9 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ executes. It is not an ORM: it does not provide managed entity state, lazy loading, identity maps, implicit graph traversal, or repository method-name query derivation. -Status: alpha. Java artifacts are published as `0.1.0-alpha.2`. Rust crates +Status: alpha. Java artifacts are prepared as `0.1.0-alpha.3`. Rust crates and the VS Code extension are published as `0.1.0`. Mortar remains pre-`1.0`; APIs may still change, and production adoption should pin exact versions and review migration notes. ## Current Scope -- Java 21 and Spring Boot 3.5.x. +- Java 25 and Spring Boot 4.1.x. - PostgreSQL 16 through a dedicated PostgreSQL renderer. - Generated Java metamodels for annotated models. - Generated fixed reads: `findById` and explicit `findAll`. @@ -93,12 +93,12 @@ Java/Spring artifacts: ```kotlin dependencies { - implementation("io.github.sequelcore:mortar-core:0.1.0-alpha.2") - implementation("io.github.sequelcore:mortar-dialect-postgres:0.1.0-alpha.2") - implementation("io.github.sequelcore:mortar-runtime-jdbc:0.1.0-alpha.2") - implementation("io.github.sequelcore:mortar-spring-boot-starter:0.1.0-alpha.2") - annotationProcessor("io.github.sequelcore:mortar-processor:0.1.0-alpha.2") - testImplementation("io.github.sequelcore:mortar-testkit:0.1.0-alpha.2") + implementation("io.github.sequelcore:mortar-core:0.1.0-alpha.3") + implementation("io.github.sequelcore:mortar-dialect-postgres:0.1.0-alpha.3") + implementation("io.github.sequelcore:mortar-runtime-jdbc:0.1.0-alpha.3") + implementation("io.github.sequelcore:mortar-spring-boot-starter:0.1.0-alpha.3") + annotationProcessor("io.github.sequelcore:mortar-processor:0.1.0-alpha.3") + testImplementation("io.github.sequelcore:mortar-testkit:0.1.0-alpha.3") } ``` diff --git a/build.gradle.kts b/build.gradle.kts index 101a300..405f546 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "io.github.sequelcore" -version = "0.1.0-alpha.2" +version = "0.1.0-alpha.3" val junitVersion = "6.0.3" val assertjVersion = "3.27.7" @@ -252,7 +252,7 @@ subprojects { extensions.configure { toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) + languageVersion.set(JavaLanguageVersion.of(25)) } } diff --git a/docs/plan.md b/docs/plan.md index 7eb213f..4707f38 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -34,6 +34,17 @@ without changing Mortar into an ORM. ## Release Recommendation -Consumers need Java artifact version `0.1.0-alpha.2` for this behavior. +Consumers need Java artifact version `0.1.0-alpha.2` for this behavior on +Spring Boot 3.5.x. Spring Boot 4.1.x consumers should use `0.1.0-alpha.3`. + +## R27 Spring Boot 4.1 Platform Certification + +Status: Done. + +| Slice | Files | Verification | +| --- | --- | --- | +| R27.1 Spring Boot starter baseline | `java/spring-boot-starter/build.gradle.kts`, `java/spring-boot-starter/src/test/java/dev/mortar/spring/MortarSpringBootCompatibilityTest.java` | Starter tests compile and run against Spring Boot 4.1.0. | +| R27.2 Java 25 toolchain | `build.gradle.kts`, `settings.gradle.kts`, `java/processor/src/main/java/dev/mortar/processor/MortarProcessor.java` | Java modules compile with a Java 25 toolchain; the processor declares `RELEASE_25`. | +| R27.3 Public docs and release metadata | `README.md`, `CHANGELOG.md`, `docs/spring-boot-compatibility.md`, `docs/release.md`, `docs/roadmap.md`, `docs/spring-boot-postgres-example.md`, `.github/workflows/publish.yml` | Public docs state the Spring Boot 4.1 and Java 25 baseline for `0.1.0-alpha.3`. | `0.1.0-alpha.1` does not contain the JPA discovery default change or the UUID fixed-read helper fix. diff --git a/docs/release.md b/docs/release.md index 51b1500..e7e6f06 100644 --- a/docs/release.md +++ b/docs/release.md @@ -42,8 +42,8 @@ change must be listed in `CHANGELOG.md` and linked from release notes. Current tested compatibility envelope: -- Java 21; -- Spring Boot 3.5.x for the starter; +- Java 25; +- Spring Boot 4.1.x for the starter; - PostgreSQL 16 for PostgreSQL Testcontainers evidence; - PostgreSQL as the only supported starter dialect; - Rust stable toolchain for CLI/compiler/LSP crates. diff --git a/docs/roadmap.md b/docs/roadmap.md index 9cfa063..0c3f62e 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -10,13 +10,13 @@ readiness work. Git history remains the detailed project history. ## Current Status Mortar is alpha. Java artifacts are prepared for Maven Central as -`0.1.0-alpha.2`. Rust tooling crates and the VS Code extension remain published +`0.1.0-alpha.3`. Rust tooling crates and the VS Code extension remain published as `0.1.0`. The project remains pre-`1.0`; APIs may still change before a stable release. Supported current scope: -- Java 21, Spring Boot 3.5.x, JDBC, and PostgreSQL 16 evidence. +- Java 25, Spring Boot 4.1.x, JDBC, and PostgreSQL 16 evidence. - Framework-free core query model and DSL. - Java annotation processor for generated `Q*` metamodels. - Generated fixed reads for `findById` and explicit `findAll`. @@ -50,6 +50,7 @@ Current limits: | R24 Public documentation and pre-release readiness | Done | Public documentation, API/Javadocs, examples, packaging dry-runs, CI/security posture, performance wording, benchmark evidence boundaries, and the first alpha publication decision are complete. | | R25 Formal release automation and first alpha publication | Done | Guarded release workflow added; Java artifacts, Rust crates, and VS Code extension published for the first alpha. | | R26 Incremental Spring/JPA adoption hardening | Done | Mortar processor discovery is explicit by default so existing Spring/JPA applications can adopt Mortar without generating metamodels for every JPA entity. UUID identifier row models compile generated fixed-read helpers. | +| R27 Spring Boot 4.1 platform certification | Done | The Spring Boot starter compiles and tests against Spring Boot 4.1.0 and Spring Framework 7.0.8, with Java 25 toolchain certification for Java modules. | R23 retained evidence covers the reviewed Java runtime, Rust tooling/LSP, and VS Code editor-latency families. The durable evidence reference is the retained @@ -150,15 +151,39 @@ choose it deliberately. R26 prepares Java artifact version `0.1.0-alpha.2`. Rust crates and editor artifacts remain at `0.1.0`. +## R27: Spring Boot 4.1 Platform Certification + +Status: Done + +Purpose: align Mortar with Sequel's 2026 backend platform direction after +Vigil's Spring Boot 4.1 certification. Mortar remains Java-first, +SQL-transparent, and not an ORM; this slice certifies the Spring Boot adapter +line and Java toolchain, not a broader persistence abstraction. + +| Slice | Status | Outcome | +| --- | --- | --- | +| R27.1 Spring Boot starter certification | Done | `java/spring-boot-starter` compiles and tests against Spring Boot 4.1.0 and Spring Framework 7.0.8. | +| R27.2 Java 25 toolchain certification | Done | Java modules use a Java 25 Gradle toolchain, the processor declares `RELEASE_25`, and Foojay toolchain provisioning is enabled. | +| R27.3 Documentation and release alignment | Done | README, compatibility docs, release policy, changelog, and the Spring Boot example state the Boot 4.1 and Java 25 baseline. | + +R27 prepares Java artifact version `0.1.0-alpha.3`. Rust crates and editor +artifacts remain at `0.1.0`. + ## Release Path R25 closes the first alpha publication action. Published artifacts: -- Maven Central: `io.github.sequelcore:mortar-*` version `0.1.0-alpha.2`. +- Maven Central: `io.github.sequelcore:mortar-*` version `0.1.0-alpha.1`. - crates.io: `sequel-mortar-compiler`, `sequel-mortar-cli`, and `sequel-mortar-lsp` version `0.1.0`. - Visual Studio Marketplace: `sequelcore.mortar-vscode` version `0.1.0` pre-release. +Prepared Java artifacts: + +- `0.1.0-alpha.2` for incremental Spring/JPA adoption hardening on the Spring + Boot 3.5.x line. +- `0.1.0-alpha.3` for Spring Boot 4.1.x and Java 25 platform certification. + Application migration, stable API commitments, and public performance claims remain outside the first alpha. diff --git a/docs/spring-boot-compatibility.md b/docs/spring-boot-compatibility.md index b487841..be0e2d9 100644 --- a/docs/spring-boot-compatibility.md +++ b/docs/spring-boot-compatibility.md @@ -6,8 +6,8 @@ Mortar's Spring Boot starter follows Spring Boot's current auto-configuration mo | Spring Boot line | Status | Verification | Notes | | --- | --- | --- | --- | -| 3.5.x | Tested | `java/spring-boot-starter` compiles and tests against Spring Boot 3.5.14 | Primary supported line for the current Mortar development cycle. | -| 4.x | Planned | Not yet compiled in CI | Support requires a dedicated compatibility lane before being marked tested. | +| 4.1.x | Tested | `java/spring-boot-starter` compiles and tests against Spring Boot 4.1.0 | Primary supported line for the current Mortar development cycle. | +| 3.5.x | Previous alpha line | Last tested in `0.1.0-alpha.2` against Spring Boot 3.5.14 | Supported consumers should stay pinned to `0.1.0-alpha.2` until they migrate to Spring Boot 4.1.x. | ## Compatibility Rules @@ -63,9 +63,10 @@ The boundary follows current platform practice: ## Current Baseline -- Spring Boot autoconfigure: `3.5.14` -- Spring Boot starter test: `3.5.14` -- Spring Boot starter JDBC: `3.5.14` -- Spring Boot starter Actuator: `3.5.14` +- Spring Boot autoconfigure: `4.1.0` +- Spring Boot starter test: `4.1.0` +- Spring Boot starter JDBC: `4.1.0` +- Spring Boot starter Actuator: `4.1.0` +- Spring Framework JDBC: `7.0.8` The canonical version source is `java/spring-boot-starter/build.gradle.kts`. diff --git a/docs/spring-boot-postgres-example.md b/docs/spring-boot-postgres-example.md index b6fac95..2f982bc 100644 --- a/docs/spring-boot-postgres-example.md +++ b/docs/spring-boot-postgres-example.md @@ -6,7 +6,7 @@ For copyable repository recipes using the same patterns, see ## What It Shows -- Spring Boot 3.5 wiring through `java/spring-boot-starter`. +- Spring Boot 4.1 wiring through `java/spring-boot-starter`. - PostgreSQL rendering through `java/dialect-postgres`. - JDBC execution boundary through `MortarJdbcClient`. - Generated Java metamodels through `java/processor`. diff --git a/examples/spring-boot-postgres/build.gradle.kts b/examples/spring-boot-postgres/build.gradle.kts index db9eeff..e04f2ee 100644 --- a/examples/spring-boot-postgres/build.gradle.kts +++ b/examples/spring-boot-postgres/build.gradle.kts @@ -1,15 +1,17 @@ description = "Runnable Spring Boot PostgreSQL example for Mortar." +val springBootVersion = "4.1.0" + dependencies { implementation(project(":java:spring-boot-starter")) - implementation("org.springframework.boot:spring-boot-starter-jdbc:3.5.14") + implementation("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion") compileOnly(project(":java:processor")) annotationProcessor(project(":java:processor")) runtimeOnly("org.postgresql:postgresql:42.7.11") testImplementation(project(":java:testkit")) - testImplementation("org.springframework.boot:spring-boot-starter-test:3.5.14") + testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion") } tasks.withType().configureEach { diff --git a/java/processor/src/main/java/dev/mortar/processor/MortarProcessor.java b/java/processor/src/main/java/dev/mortar/processor/MortarProcessor.java index 805e7d3..e957b9d 100644 --- a/java/processor/src/main/java/dev/mortar/processor/MortarProcessor.java +++ b/java/processor/src/main/java/dev/mortar/processor/MortarProcessor.java @@ -38,7 +38,7 @@ */ @SupportedAnnotationTypes("*") @SupportedOptions(MortarProcessor.JPA_DISCOVERY_OPTION) -@SupportedSourceVersion(SourceVersion.RELEASE_21) +@SupportedSourceVersion(SourceVersion.RELEASE_25) public final class MortarProcessor extends AbstractProcessor { static final String JPA_DISCOVERY_OPTION = "mortar.jpaDiscovery"; private final List sharedMetadata = new ArrayList<>(); diff --git a/java/processor/src/test/java/dev/mortar/processor/MortarProcessorGradleIncrementalConvergenceTest.java b/java/processor/src/test/java/dev/mortar/processor/MortarProcessorGradleIncrementalConvergenceTest.java index 706f62a..d23c37d 100644 --- a/java/processor/src/test/java/dev/mortar/processor/MortarProcessorGradleIncrementalConvergenceTest.java +++ b/java/processor/src/test/java/dev/mortar/processor/MortarProcessorGradleIncrementalConvergenceTest.java @@ -99,7 +99,7 @@ private static void writeFixtureProject(Path projectDir) throws Exception { java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(25) } } diff --git a/java/processor/src/test/java/dev/mortar/processor/MortarProcessorTest.java b/java/processor/src/test/java/dev/mortar/processor/MortarProcessorTest.java index af4b35f..f00eaff 100644 --- a/java/processor/src/test/java/dev/mortar/processor/MortarProcessorTest.java +++ b/java/processor/src/test/java/dev/mortar/processor/MortarProcessorTest.java @@ -20,7 +20,7 @@ void processorDoesNotClaimRoundsYet() { MortarProcessor processor = new MortarProcessor(); assertThat(processor.process(Set.of(), null)).isFalse(); - assertThat(processor.getSupportedSourceVersion().name()).isEqualTo("RELEASE_21"); + assertThat(processor.getSupportedSourceVersion().name()).isEqualTo("RELEASE_25"); } @Test diff --git a/java/runtime-jdbc/src/main/java/dev/mortar/jdbc/MortarJdbcLogger.java b/java/runtime-jdbc/src/main/java/dev/mortar/jdbc/MortarJdbcLogger.java index ec87dc2..5bbf5ae 100644 --- a/java/runtime-jdbc/src/main/java/dev/mortar/jdbc/MortarJdbcLogger.java +++ b/java/runtime-jdbc/src/main/java/dev/mortar/jdbc/MortarJdbcLogger.java @@ -1,9 +1,9 @@ package dev.mortar.jdbc; -@FunctionalInterface /** * Logging boundary for applications that want visibility into executed SQL. */ +@FunctionalInterface public interface MortarJdbcLogger { void log(MortarJdbcLogEvent event); diff --git a/java/spring-boot-starter/build.gradle.kts b/java/spring-boot-starter/build.gradle.kts index d35bbb6..7717104 100644 --- a/java/spring-boot-starter/build.gradle.kts +++ b/java/spring-boot-starter/build.gradle.kts @@ -1,18 +1,21 @@ description = "Spring Boot auto-configuration for Mortar." +val springBootVersion = "4.1.0" +val springFrameworkVersion = "7.0.8" + dependencies { api(project(":java:core")) api(project(":java:dialect-postgres")) api(project(":java:runtime-jdbc")) - compileOnly("org.springframework.boot:spring-boot-autoconfigure:3.5.14") - compileOnly("org.springframework.boot:spring-boot-actuator-autoconfigure:3.5.14") - compileOnly("org.springframework:spring-jdbc:6.2.9") - annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:3.5.14") + compileOnly("org.springframework.boot:spring-boot-autoconfigure:$springBootVersion") + compileOnly("org.springframework.boot:spring-boot-actuator-autoconfigure:$springBootVersion") + compileOnly("org.springframework:spring-jdbc:$springFrameworkVersion") + annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:$springBootVersion") - testImplementation("org.springframework.boot:spring-boot-starter-test:3.5.14") - testImplementation("org.springframework.boot:spring-boot-starter-jdbc:3.5.14") - testImplementation("org.springframework.boot:spring-boot-starter-actuator:3.5.14") + testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion") + testImplementation("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion") + testImplementation("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion") } tasks.withType().configureEach { diff --git a/java/spring-boot-starter/src/test/java/dev/mortar/spring/MortarSpringBootCompatibilityTest.java b/java/spring-boot-starter/src/test/java/dev/mortar/spring/MortarSpringBootCompatibilityTest.java index cc5ef9d..b09dd3e 100644 --- a/java/spring-boot-starter/src/test/java/dev/mortar/spring/MortarSpringBootCompatibilityTest.java +++ b/java/spring-boot-starter/src/test/java/dev/mortar/spring/MortarSpringBootCompatibilityTest.java @@ -7,7 +7,7 @@ final class MortarSpringBootCompatibilityTest { @Test - void runsAgainstDocumentedSpringBoot35Baseline() { - assertThat(SpringBootVersion.getVersion()).startsWith("3.5."); + void runsAgainstDocumentedSpringBoot41Baseline() { + assertThat(SpringBootVersion.getVersion()).startsWith("4.1."); } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 8ae6085..8243418 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,7 @@ pluginManagement { plugins { id("org.jetbrains.intellij.platform.settings") version "2.16.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } dependencyResolutionManagement {