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
62 changes: 61 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,70 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

---

## [0.5.0] - 2026-01-12
## [0.5.0] - 2026-01-16

### API Freeze

This release marks the **API freeze** for Aether Datafixers. The public API is now stable and no breaking changes are expected before v1.0.0.

### Added

#### SchemaValidator Fix Coverage Integration (`aether-datafixers-schema-tools`)

The `SchemaValidator.validateFixCoverage()` method now performs actual coverage analysis using `MigrationAnalyzer`:

- **Full MigrationAnalyzer integration** — Detects missing DataFixes for schema changes
- **Automatic version range detection** — Scans the entire schema registry to determine version bounds
- **Field-level coverage gaps** — Reports issues for added, removed, or modified fields without fixes
- **Detailed context** — Issues include type, field name, version range, and gap reason

**Usage:**
```java
ValidationResult result = SchemaValidator.forBootstrap(bootstrap)
.validateFixCoverage()
.validate();

for (ValidationIssue issue : result.warnings()) {
System.out.println(issue.message());
// "Missing DataFix for type 'player' field 'health': FIELD_ADDED"
}
```

#### MigrationService.withOps() Implementation (`aether-datafixers-spring-boot-starter`)

The Spring Boot `MigrationService` now fully supports custom `DynamicOps` for format conversion:

- **Format conversion during migration** — Convert input data to specified format before migration
- **Seamless API integration** — Works with the existing fluent builder API
- **All formats supported** — Gson, Jackson JSON, YAML (both), TOML, and XML

**Usage:**
```java
// Convert Gson data to Jackson YAML format during migration
MigrationResult result = migrationService
.migrate(gsonData)
.from(100)
.to(200)
.withOps(JacksonYamlOps.INSTANCE)
.execute();

// Result data is now in Jackson YAML format
Dynamic<JsonNode> yamlResult = (Dynamic<JsonNode>) result.getData();
```

#### Functional Tests Module (`aether-datafixers-functional-tests`)

New module with comprehensive end-to-end and integration tests:

- **Cross-format migration tests** — Verify migrations work identically across all DynamicOps implementations
- **Error recovery tests** — Test graceful handling of malformed data and fix failures
- **Field transformation E2E tests** — Validate rename, add, remove, and group operations

**Running:**
```bash
mvn verify -Pit
```

#### CLI Format Handlers for YAML, TOML, and XML (`aether-datafixers-cli`)

Extended the CLI with four new built-in format handlers:
Expand Down
46 changes: 25 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
![License](https://img.shields.io/badge/license-MIT-red)
![Maven Central](https://img.shields.io/maven-central/v/de.splatgames.aether.datafixers/aether-datafixers)
![Version](https://img.shields.io/badge/version-0.4.0-orange)
![Version](https://img.shields.io/badge/version-0.5.0-orange)

# Aether Datafixers 🔧

Expand All @@ -10,7 +10,7 @@ inspired by Minecraft's DataFixer Upper (DFU), with a focus on **simplicity**, *

---

## ✨ Features (v0.4.0)
## ✨ Features (v0.5.0)

- ✅ **Schema-Based Versioning** — Define data types per version with `Schema` and `TypeRegistry`
- ✅ **Forward Patching** — Apply `DataFix` instances sequentially to migrate data across versions
Expand All @@ -25,6 +25,8 @@ inspired by Minecraft's DataFixer Upper (DFU), with a focus on **simplicity**, *
- ✅ **Migration Diagnostics** — Opt-in structured reports with timing, applied fixes, and snapshots
- ✅ **Extended Rewrite Rules** — Batch operations, path-based transforms, conditional rules
- ✅ **High-Performance APIs** — `Rules.batch()` for single-pass multi-operation transforms
- ✅ **Fix Coverage Validation** — Detect schema changes without corresponding DataFixes
- ✅ **Extended Codec Support** — Multi-format DynamicOps for CLI and Testkit modules
- ✅ **JDK 17+** — Built and tested on modern LTS JVMs

---
Expand All @@ -39,6 +41,7 @@ inspired by Minecraft's DataFixer Upper (DFU), with a focus on **simplicity**, *
- **aether-datafixers-schema-tools** — Schema analysis, validation, diffing, and introspection
- **aether-datafixers-spring-boot-starter** — Spring Boot 3.x auto-configuration with Actuator support
- **aether-datafixers-examples** — Practical examples demonstrating real-world usage
- **aether-datafixers-functional-tests** — End-to-end and integration tests
- **aether-datafixers-bom** — Bill of Materials for coordinated dependency management

---
Expand Down Expand Up @@ -89,23 +92,23 @@ Dynamic<?> updated = fixer.update(
<dependency>
<groupId>de.splatgames.aether.datafixers</groupId>
<artifactId>aether-datafixers-core</artifactId>
<version>0.4.0</version>
<version>0.5.0</version>
</dependency>
```

**Gradle (Groovy)**

```groovy
dependencies {
implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0'
implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0'
}
```

**Gradle (Kotlin)**

```kotlin
dependencies {
implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0")
implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0")
}
```

Expand All @@ -125,7 +128,7 @@ The Bill of Materials (BOM) ensures consistent versions across all Aether Datafi
<dependency>
<groupId>de.splatgames.aether.datafixers</groupId>
<artifactId>aether-datafixers-bom</artifactId>
<version>0.4.0</version>
<version>0.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand All @@ -149,7 +152,7 @@ The Bill of Materials (BOM) ensures consistent versions across all Aether Datafi

```groovy
dependencies {
implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.4.0')
implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.5.0')

// No version needed
implementation 'de.splatgames.aether.datafixers:aether-datafixers-core'
Expand All @@ -161,7 +164,7 @@ dependencies {

```kotlin
dependencies {
implementation(platform("de.splatgames.aether.datafixers:aether-datafixers-bom:0.4.0"))
implementation(platform("de.splatgames.aether.datafixers:aether-datafixers-bom:0.5.0"))

// No version needed
implementation("de.splatgames.aether.datafixers:aether-datafixers-core")
Expand Down Expand Up @@ -366,14 +369,14 @@ The `aether-datafixers-spring-boot-starter` provides comprehensive Spring Boot 3
<dependency>
<groupId>de.splatgames.aether.datafixers</groupId>
<artifactId>aether-datafixers-spring-boot-starter</artifactId>
<version>0.4.0</version>
<version>0.5.0</version>
</dependency>
```

**Gradle (Kotlin)**

```kotlin
implementation("de.splatgames.aether.datafixers:aether-datafixers-spring-boot-starter:0.4.0")
implementation("de.splatgames.aether.datafixers:aether-datafixers-spring-boot-starter:0.5.0")
```

### Quick Start
Expand Down Expand Up @@ -562,24 +565,25 @@ mvn test
- **Fix coverage analysis** — Detect schema changes without corresponding DataFixes
- **Convention checking** — Enforce naming conventions for types, fields, and classes

- **v0.4.0** (current)
- **v0.4.0**
- **Spring Boot Starter** — Auto-configuration, MigrationService with fluent API
- **Actuator integration** — Health indicator, info contributor, custom endpoint, Micrometer metrics
- **Multi-domain support** — Multiple DataFixers with @Qualifier annotations
- **DynamicOps auto-configuration** — Conditional beans for all supported formats
- **Multi-format DynamicOps** — YAML (SnakeYAML, Jackson), TOML (Jackson), XML (Jackson)
- **Package restructuring** — Format-first package organization (`codec.json.gson`, `codec.yaml.jackson`, etc.)

- **v0.5.0** (next, API freeze candidate – expect one last missed out feature)
- **Codec integration** — Integration of extra codecs for aether-datafixers-testkit and aether-datafixers-cli
- **API stabilization pass** — Naming/packaging cleanup + deprecations completed
- **Compatibility checks in CI** — Binary/source compatibility guardrails for public API
- **Hardened error model** — Consistent exception types + structured error details
- **Release readiness** — Final review of docs/examples against frozen API

- **v1.0.0**
- Stable API surface
- Comprehensive documentation
- **v0.5.0** (current, API freeze)
- **API Freeze** — Public API stabilized, no breaking changes expected before v1.0.0
- **Extended Codec Support** — Multi-format DynamicOps integration for CLI, Testkit and Spring Boot modules
- **SchemaValidator integration** — Full `MigrationAnalyzer` integration for fix coverage validation
- **MigrationService.withOps()** — Custom `DynamicOps` support for format conversion during migrations
- **Functional Tests module** — Comprehensive E2E and integration tests
- **Comprehensive documentation** — Complete documentation suite covering all modules

- **v1.0.0** (next)
- Stable API surface with semantic versioning guarantees
- Performance benchmarks
- Production-ready release

---
Expand Down
Loading
Loading