Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down Expand Up @@ -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")
}
```

Expand Down
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -252,7 +252,7 @@ subprojects {

extensions.configure<JavaPluginExtension> {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

Expand Down
13 changes: 12 additions & 1 deletion docs/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
4 changes: 2 additions & 2 deletions docs/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
31 changes: 28 additions & 3 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
13 changes: 7 additions & 6 deletions docs/spring-boot-compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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`.
2 changes: 1 addition & 1 deletion docs/spring-boot-postgres-example.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
6 changes: 4 additions & 2 deletions examples/spring-boot-postgres/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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<JavaCompile>().configureEach {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<EntityMetadata> sharedMetadata = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ private static void writeFixtureProject(Path projectDir) throws Exception {

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
languageVersion = JavaLanguageVersion.of(25)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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);

Expand Down
17 changes: 10 additions & 7 deletions java/spring-boot-starter/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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<JavaCompile>().configureEach {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

final class MortarSpringBootCompatibilityTest {
@Test
void runsAgainstDocumentedSpringBoot35Baseline() {
assertThat(SpringBootVersion.getVersion()).startsWith("3.5.");
void runsAgainstDocumentedSpringBoot41Baseline() {
assertThat(SpringBootVersion.getVersion()).startsWith("4.1.");
}
}
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading