diff --git a/CHANGELOG.md b/CHANGELOG.md index aca3763..212a235 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 yamlResult = (Dynamic) 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: diff --git a/README.md b/README.md index 6add933..63d54c9 100644 --- a/README.md +++ b/README.md @@ -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 🔧 @@ -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 @@ -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 --- @@ -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 --- @@ -89,7 +92,7 @@ Dynamic updated = fixer.update( de.splatgames.aether.datafixers aether-datafixers-core - 0.4.0 + 0.5.0 ``` @@ -97,7 +100,7 @@ Dynamic updated = fixer.update( ```groovy dependencies { - implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0' + implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0' } ``` @@ -105,7 +108,7 @@ dependencies { ```kotlin dependencies { - implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0") + implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0") } ``` @@ -125,7 +128,7 @@ The Bill of Materials (BOM) ensures consistent versions across all Aether Datafi de.splatgames.aether.datafixers aether-datafixers-bom - 0.4.0 + 0.5.0 pom import @@ -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' @@ -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") @@ -366,14 +369,14 @@ The `aether-datafixers-spring-boot-starter` provides comprehensive Spring Boot 3 de.splatgames.aether.datafixers aether-datafixers-spring-boot-starter - 0.4.0 + 0.5.0 ``` **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 @@ -562,7 +565,7 @@ 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 @@ -570,16 +573,17 @@ mvn test - **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 --- diff --git a/RELEASE.md b/RELEASE.md index 8e8ee42..a94f5b1 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,15 +1,17 @@ -# 🚀 **Aether Datafixers v0.4.0 — Spring Boot Integration & Multi-Format DynamicOps** +# 🚀 **Aether Datafixers v0.5.0 — API Freeze & Release Readiness** -Spring Boot auto-configuration with fluent MigrationService API, Actuator integration, and comprehensive multi-format support for YAML, TOML, and XML. +The API freeze release with stabilized public interfaces, comprehensive validation tooling, extended codec support, and full multi-format integration across all modules. --- -## 🎯 Highlights in v0.4.0 +## 🎯 Highlights in v0.5.0 -- ✅ **Spring Boot Starter** — New `aether-datafixers-spring-boot-starter` module with auto-configuration, fluent `MigrationService` API, multi-domain support, Actuator health/info/endpoints, and Micrometer metrics -- ✅ **Multi-Format DynamicOps** — New DynamicOps implementations for YAML (SnakeYAML, Jackson), TOML (Jackson), and XML (Jackson) -- ✅ **Package Restructuring** — Format-first package organization (`codec.json.gson`, `codec.yaml.jackson`, etc.) -- ✅ **Comprehensive Documentation** — New Spring Boot integration docs and codec format guides +- ✅ **API Freeze** — Public API is now stable; no breaking changes expected before v1.0.0 +- ✅ **Schema Validation Integration** — Full `MigrationAnalyzer` integration for fix coverage validation +- ✅ **MigrationService.withOps()** — Custom `DynamicOps` support for format conversion during migrations +- ✅ **Extended Codec Support** — Multi-format DynamicOps integration for CLI, Testkit and Spring Boot modules +- ✅ **Functional Tests Module** — New `aether-datafixers-functional-tests` with E2E and integration tests +- ✅ **Comprehensive Documentation** — Complete documentation suite covering all modules and features --- @@ -24,7 +26,7 @@ Spring Boot auto-configuration with fluent MigrationService API, Actuator integr de.splatgames.aether.datafixers aether-datafixers-core - 0.4.0 + 0.5.0 ``` @@ -36,7 +38,7 @@ Spring Boot auto-configuration with fluent MigrationService API, Actuator integr de.splatgames.aether.datafixers aether-datafixers-bom - 0.4.0 + 0.5.0 pom import @@ -56,9 +58,9 @@ Spring Boot auto-configuration with fluent MigrationService API, Actuator integr ```groovy dependencies { - implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0' + implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0' // Or with BOM: - implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.4.0') + implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.5.0') implementation 'de.splatgames.aether.datafixers:aether-datafixers-core' } ``` @@ -67,9 +69,9 @@ dependencies { ```kotlin dependencies { - implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0") + implementation("de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0") // Or with BOM: - implementation(platform("de.splatgames.aether.datafixers:aether-datafixers-bom:0.4.0")) + implementation(platform("de.splatgames.aether.datafixers:aether-datafixers-bom:0.5.0")) implementation("de.splatgames.aether.datafixers:aether-datafixers-core") } ``` @@ -78,148 +80,165 @@ dependencies { ## 🆕 What's New -### 🍃 Spring Boot Starter Module +### 🔍 SchemaValidator Fix Coverage Integration -New module `aether-datafixers-spring-boot-starter` for seamless Spring Boot 3.x integration: +The `SchemaValidator.validateFixCoverage()` method now performs actual coverage analysis using `MigrationAnalyzer`: -```xml - - de.splatgames.aether.datafixers - aether-datafixers-spring-boot-starter - 0.4.0 - +```java +ValidationResult result = SchemaValidator.forBootstrap(bootstrap) + .validateFixCoverage() + .validate(); + +if (result.hasWarnings()) { + for (ValidationIssue issue : result.warnings()) { + System.out.println("Missing fix: " + issue.message()); + // e.g., "Missing DataFix for type 'player' field 'health': FIELD_ADDED" + } +} ``` -**Key Features:** +**Features:** +- Automatically analyzes the full version range from schema registry +- Detects missing DataFixes for schema changes (field additions, removals, type changes) +- Reports field-level coverage gaps with detailed context +- Integrates seamlessly with existing validation pipeline -| Feature | Description | -|-----------------------|---------------------------------------------------------------------| -| 🔧 Auto-Configuration | Automatic DataFixer bean creation from `DataFixerBootstrap` beans | -| 🔄 MigrationService | Fluent API: `.migrate(data).from(100).to(200).execute()` | -| 🏷️ Multi-Domain | Multiple DataFixers with `@Qualifier` and `.usingDomain("game")` | -| 💚 Actuator | Health indicator, info contributor, `/actuator/datafixers` endpoint | -| 📊 Metrics | Micrometer counters, timers, and distribution summaries | -| ⚡ Async | `CompletableFuture` support via `.executeAsync()` | +### 🔄 MigrationService.withOps() Support -**Quick Start:** +The Spring Boot `MigrationService` now fully supports custom `DynamicOps` for format conversion: ```java -@Configuration -public class DataFixerConfig { - @Bean - public DataFixerBootstrap gameBootstrap() { - return new GameDataBootstrap(); - } -} - -@Service -public class GameService { - private final MigrationService migrationService; - - public Dynamic migrateData(Dynamic data, int fromVersion) { - return migrationService - .migrate(data) - .from(fromVersion) - .toLatest() - .execute() - .getData(); - } -} +// Convert input data to Jackson YAML format during migration +MigrationResult result = migrationService + .migrate(gsonData) + .from(100) + .to(200) + .withOps(JacksonYamlOps.INSTANCE) // Now fully functional! + .execute(); + +// Result data is now in Jackson YAML format +Dynamic yamlResult = (Dynamic) result.getData(); ``` -**Configuration Properties:** - -```yaml -aether: - datafixers: - enabled: true - default-format: gson # gson | jackson | jackson_yaml | snakeyaml | jackson_toml | jackson_xml - default-current-version: 200 - domains: - game: - current-version: 200 - primary: true - actuator: - include-schema-details: true - metrics: - timing: true - counting: true -``` +**Use Cases:** +- Convert between serialization formats during migration +- Normalize data to a specific format for downstream processing +- Work with format-specific features (e.g., YAML anchors, TOML tables) -### 🔌 Multi-Format DynamicOps +### 🔌 Extended Codec Support for CLI & Testkit -New DynamicOps implementations in the codec module: +Full multi-format DynamicOps integration for the CLI and Testkit modules: -| Format | Implementation | Data Type | Library | -|--------|------------------|---------------|--------------| -| JSON | `GsonOps` | `JsonElement` | Gson | -| JSON | `JacksonJsonOps` | `JsonNode` | Jackson | -| YAML | `SnakeYamlOps` | `Object` | SnakeYAML | -| YAML | `JacksonYamlOps` | `JsonNode` | Jackson YAML | -| TOML | `JacksonTomlOps` | `JsonNode` | Jackson TOML | -| XML | `JacksonXmlOps` | `JsonNode` | Jackson XML | +**CLI Format Handlers:** -**Example:** +| Format ID | Library | Data Type | File Extensions | +|------------------|--------------|---------------|-----------------| +| `json-gson` | Gson | `JsonElement` | `.json` | +| `json-jackson` | Jackson | `JsonNode` | `.json` | +| `yaml-snakeyaml` | SnakeYAML | `Object` | `.yaml`, `.yml` | +| `yaml-jackson` | Jackson YAML | `JsonNode` | `.yaml`, `.yml` | +| `toml-jackson` | Jackson TOML | `JsonNode` | `.toml` | +| `xml-jackson` | Jackson XML | `JsonNode` | `.xml` | + +**Testkit Factory Methods:** ```java -// YAML with SnakeYAML (native Java types) -Dynamic yaml = new Dynamic<>(SnakeYamlOps.INSTANCE, yamlData); +// All formats now supported in TestData +Dynamic gson = TestData.gson().object().put("key", "value").build(); +Dynamic jackson = TestData.jacksonJson().object().put("key", "value").build(); +Dynamic yaml = TestData.snakeYaml().object().put("key", "value").build(); +Dynamic yamlJ = TestData.jacksonYaml().object().put("key", "value").build(); +Dynamic toml = TestData.jacksonToml().object().put("key", "value").build(); +Dynamic xml = TestData.jacksonXml().object().put("key", "value").build(); +``` -// TOML with Jackson -Dynamic toml = new Dynamic<>(JacksonTomlOps.INSTANCE, tomlData); +### 🧪 Functional Tests Module -// Cross-format conversion -Dynamic json = yaml.convert(GsonOps.INSTANCE); -``` +New `aether-datafixers-functional-tests` module with comprehensive E2E and integration tests: -### ⚠️ Breaking Change: Package Restructuring +| Test Category | Description | +|-------------------------|--------------------------------------------------------------| +| Cross-Format Migration | Validate migrations work identically across all DynamicOps | +| Error Recovery | Test graceful handling of malformed data and fix failures | +| Field Transformations | E2E tests for rename, add, remove, and restructure operations| -The codec module now uses format-first package organization: +Run integration tests with: -**Old:** -```java -import de.splatgames.aether.datafixers.codec.gson.GsonOps; -import de.splatgames.aether.datafixers.codec.jackson.JacksonOps; +```bash +mvn verify -Pit ``` -**New:** -```java -import de.splatgames.aether.datafixers.codec.json.gson.GsonOps; -import de.splatgames.aether.datafixers.codec.json.jackson.JacksonJsonOps; -import de.splatgames.aether.datafixers.codec.yaml.snakeyaml.SnakeYamlOps; -import de.splatgames.aether.datafixers.codec.yaml.jackson.JacksonYamlOps; -import de.splatgames.aether.datafixers.codec.toml.jackson.JacksonTomlOps; -import de.splatgames.aether.datafixers.codec.xml.jackson.JacksonXmlOps; -``` +--- + +## 📋 Module Overview + +| Module | Description | +|-----------------------------------------|--------------------------------------------------------------| +| `aether-datafixers-api` | Core interfaces and API contracts (stable) | +| `aether-datafixers-core` | Default implementations | +| `aether-datafixers-codec` | DynamicOps for JSON, YAML, TOML, XML | +| `aether-datafixers-testkit` | Testing utilities with fluent API + multi-format support | +| `aether-datafixers-cli` | Command-line interface with multi-format handlers | +| `aether-datafixers-schema-tools` | Schema analysis, validation, and diffing | +| `aether-datafixers-spring-boot-starter` | Spring Boot 3.x auto-configuration | +| `aether-datafixers-examples` | Practical usage examples | +| `aether-datafixers-functional-tests` | E2E and integration tests | +| `aether-datafixers-bom` | Bill of Materials for version management | --- ## 📝 Changelog -**New in 0.4.0** +**New in 0.5.0** + +- `SchemaValidator.validateFixCoverage()` now performs actual coverage analysis via `MigrationAnalyzer` +- `MigrationService.withOps()` fully implemented for format conversion during migrations +- Extended codec support: CLI format handlers for YAML, TOML, XML +- Extended codec support: Testkit factory methods for all DynamicOps implementations +- New `aether-datafixers-functional-tests` module with comprehensive E2E and IT tests +- Cross-format migration tests (Gson, Jackson JSON, Jackson YAML, SnakeYAML, TOML, XML) +- Error recovery integration tests with graceful failure handling +- Field transformation E2E tests (rename, add, group operations) +- API stabilization: public interfaces frozen for v1.0.0 +- Comprehensive documentation updates across all modules + +**Deprecations (removal planned for v1.0.0)** -- Spring Boot Starter with auto-configuration and MigrationService -- Actuator health indicator, info contributor, and custom endpoint -- Micrometer metrics for migration success/failure/duration -- Multi-domain DataFixer support with `@Qualifier` -- SnakeYamlOps for YAML (native Java types) -- JacksonYamlOps for YAML (Jackson dataformat) -- JacksonTomlOps for TOML -- JacksonXmlOps for XML -- Format-first package restructuring in codec module -- Comprehensive Spring Boot and codec documentation +- `de.splatgames.aether.datafixers.codec.gson.GsonOps` — Use `codec.json.gson.GsonOps` +- `de.splatgames.aether.datafixers.codec.jackson.JacksonOps` — Use `codec.json.jackson.JacksonJsonOps` for JSON, or the format-specific classes (`JacksonYamlOps`, `JacksonTomlOps`, `JacksonXmlOps`) +- `TestData.jackson()` — Use `TestData.jacksonJson()` instead -**Full Changelog:** [v0.3.0...v0.4.0](https://github.com/aether-framework/aether-datafixers/compare/v0.3.0...v0.4.0) +**Full Changelog:** [v0.4.0...v0.5.0](https://github.com/aether-framework/aether-datafixers/compare/v0.4.0...v0.5.0) --- -## 🗺️ Roadmap (next) +## 🔄 Migration from v0.4.0 + +### Breaking Changes + +None. v0.5.0 is fully backward compatible with v0.4.0. + +### Deprecated API Updates + +If using deprecated wrapper classes, update imports: + +```java +// Old (deprecated) +import de.splatgames.aether.datafixers.codec.gson.GsonOps; + +// New +import de.splatgames.aether.datafixers.codec.json.gson.GsonOps; +``` + +--- + +## 🗺️ Roadmap + +### v1.0.0 (next) -- **v0.5.0** (API freeze candidate) - - **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 +- **Stable Release** — Production-ready with semantic versioning guarantees +- **Performance Benchmarks** — Published benchmark suite +- **Extended Documentation** — Video tutorials and cookbook examples --- diff --git a/docs/README.md b/docs/README.md index 5c4ca53..482fbf0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -148,7 +148,7 @@ Seamlessly integrate Aether Datafixers into Spring Boot applications: | Module | Description | |-----------------------------------------|---------------------------------------------------------------------| -| `aether-datafixers-api` | Core interfaces and API contracts | +| `aether-datafixers-api` | Core interfaces and API contracts (stable) | | `aether-datafixers-core` | Default implementations | | `aether-datafixers-codec` | DynamicOps for JSON, YAML, TOML, XML (Gson, Jackson, SnakeYAML) | | `aether-datafixers-spring-boot-starter` | Spring Boot auto-configuration, MigrationService, Actuator, Metrics | @@ -156,6 +156,7 @@ Seamlessly integrate Aether Datafixers into Spring Boot applications: | `aether-datafixers-testkit` | Testing utilities for DataFix, Schema, and migration testing | | `aether-datafixers-schema-tools` | Schema analysis, validation, and diffing utilities | | `aether-datafixers-examples` | Practical usage examples | +| `aether-datafixers-functional-tests` | End-to-end and integration tests | | `aether-datafixers-bom` | Bill of Materials for version management | --- diff --git a/docs/appendix/changelog.md b/docs/appendix/changelog.md index 569d50c..abf1c93 100644 --- a/docs/appendix/changelog.md +++ b/docs/appendix/changelog.md @@ -4,7 +4,42 @@ History of documentation updates. For code changes, see the main [CHANGELOG.md]( --- -## Version 0.5.0 +## Version 0.5.0 (API Freeze) + +### API Freeze + +Public API is now stable. No breaking changes expected before v1.0.0. + +### SchemaValidator Fix Coverage Integration + +The `SchemaValidator.validateFixCoverage()` method now performs actual coverage analysis: + +- Full integration with `MigrationAnalyzer` for detecting missing DataFixes +- Automatic version range detection from schema registry +- Field-level coverage gap detection with detailed context +- Reports issues as `ValidationIssue` warnings with location and context + +Updated documentation: +- [Schema Validation](../schema-tools/schema-validation.md) — Updated with fix coverage validation examples + +### MigrationService.withOps() Support + +The Spring Boot `MigrationService` now fully supports custom `DynamicOps`: + +- Convert input data to specified format before migration +- Seamless integration with the fluent API +- Supports all DynamicOps implementations (Gson, Jackson, YAML, TOML, XML) + +Updated documentation: +- [MigrationService API](../spring-boot/migration-service.md) — Added withOps() usage examples + +### Functional Tests Module + +New `aether-datafixers-functional-tests` module with comprehensive E2E and integration tests: + +- Cross-format migration tests (all DynamicOps implementations) +- Error recovery integration tests +- Field transformation E2E tests (rename, add, group) ### CLI: New Built-in Format Handlers diff --git a/docs/cli/commands.md b/docs/cli/commands.md index d8e9c17..5babaec 100644 --- a/docs/cli/commands.md +++ b/docs/cli/commands.md @@ -220,7 +220,7 @@ aether-cli info [OPTIONS] Without options (or with `--formats`): ``` -Aether Datafixers CLI v0.4.0 +Aether Datafixers CLI v0.5.0 ============================ Available Formats: @@ -233,7 +233,7 @@ Available Formats: With `--bootstrap`: ``` -Aether Datafixers CLI v0.4.0 +Aether Datafixers CLI v0.5.0 ============================ Bootstrap Information: diff --git a/docs/cli/installation.md b/docs/cli/installation.md index de384e3..6810ac1 100644 --- a/docs/cli/installation.md +++ b/docs/cli/installation.md @@ -22,18 +22,18 @@ cd aether-datafixers mvn clean install # The fat JAR is located at: -# aether-datafixers-cli/target/aether-datafixers-cli-0.4.0-jar-with-dependencies.jar +# aether-datafixers-cli/target/aether-datafixers-cli-0.5.0-jar-with-dependencies.jar ``` ### Verify Installation ```bash -java -jar aether-datafixers-cli/target/aether-datafixers-cli-0.4.0-jar-with-dependencies.jar --version +java -jar aether-datafixers-cli/target/aether-datafixers-cli-0.5.0-jar-with-dependencies.jar --version ``` Expected output: ``` -Aether Datafixers CLI 0.4.0 +Aether Datafixers CLI 0.5.0 ``` --- @@ -45,7 +45,7 @@ Aether Datafixers CLI 0.4.0 Run the CLI directly with `java -jar`: ```bash -java -jar aether-datafixers-cli-0.4.0-jar-with-dependencies.jar migrate \ +java -jar aether-datafixers-cli-0.5.0-jar-with-dependencies.jar migrate \ --to 200 \ --type player \ --bootstrap com.example.MyBootstrap \ @@ -57,7 +57,7 @@ java -jar aether-datafixers-cli-0.4.0-jar-with-dependencies.jar migrate \ Add to your shell profile (`~/.bashrc`, `~/.zshrc`, etc.): ```bash -alias aether-cli='java -jar /path/to/aether-datafixers-cli-0.4.0-jar-with-dependencies.jar' +alias aether-cli='java -jar /path/to/aether-datafixers-cli-0.5.0-jar-with-dependencies.jar' ``` Then use: @@ -72,7 +72,7 @@ Create `aether-cli.bat`: ```batch @echo off -java -jar "C:\path\to\aether-datafixers-cli-0.4.0-jar-with-dependencies.jar" %* +java -jar "C:\path\to\aether-datafixers-cli-0.5.0-jar-with-dependencies.jar" %* ``` Add the directory to your PATH, then use: @@ -105,7 +105,7 @@ The CLI needs access to your `DataFixerBootstrap` implementation. There are seve Add your bootstrap JAR to the classpath: ```bash -java -cp "aether-datafixers-cli-0.4.0-jar-with-dependencies.jar:my-bootstrap.jar" \ +java -cp "aether-datafixers-cli-0.5.0-jar-with-dependencies.jar:my-bootstrap.jar" \ de.splatgames.aether.datafixers.cli.AetherCli \ migrate --to 200 --type player --bootstrap com.example.MyBootstrap input.json ``` @@ -122,7 +122,7 @@ Create a custom fat JAR that includes both the CLI and your bootstrap: de.splatgames.aether.datafixers aether-datafixers-cli - 0.4.0 + 0.5.0 @@ -151,7 +151,7 @@ Create a custom fat JAR that includes both the CLI and your bootstrap: During development, point to compiled classes: ```bash -java -cp "aether-datafixers-cli-0.4.0-jar-with-dependencies.jar:target/classes" \ +java -cp "aether-datafixers-cli-0.5.0-jar-with-dependencies.jar:target/classes" \ de.splatgames.aether.datafixers.cli.AetherCli \ migrate --to 200 --type player --bootstrap com.example.MyBootstrap input.json ``` @@ -168,14 +168,14 @@ To use the CLI as a dependency in your project (for programmatic access): de.splatgames.aether.datafixers aether-datafixers-cli - 0.4.0 + 0.5.0 ``` ### Gradle ```groovy -implementation 'de.splatgames.aether.datafixers:aether-datafixers-cli:0.4.0' +implementation 'de.splatgames.aether.datafixers:aether-datafixers-cli:0.5.0' ``` --- diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 480fba7..481309d 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -27,7 +27,7 @@ Add the core dependency to your `pom.xml`: de.splatgames.aether aether-datafixers-core - 0.4.0 + 0.5.0 ``` @@ -38,12 +38,12 @@ Add the core dependency to your `pom.xml`: de.splatgames.aether aether-datafixers-core - 0.4.0 + 0.5.0 de.splatgames.aether aether-datafixers-codec - 0.4.0 + 0.5.0 @@ -63,18 +63,18 @@ Add the testkit module for unit testing your migrations: de.splatgames.aether.datafixers aether-datafixers-core - 0.4.0 + 0.5.0 de.splatgames.aether.datafixers aether-datafixers-codec - 0.4.0 + 0.5.0 de.splatgames.aether.datafixers aether-datafixers-testkit - 0.4.0 + 0.5.0 test @@ -90,7 +90,7 @@ The Bill of Materials (BOM) ensures consistent versions across all modules: de.splatgames.aether.datafixers aether-datafixers-bom - 0.4.0 + 0.5.0 pom import @@ -124,7 +124,7 @@ The Bill of Materials (BOM) ensures consistent versions across all modules: ```groovy dependencies { - implementation 'de.splatgames.aether:aether-datafixers-core:0.4.0' + implementation 'de.splatgames.aether:aether-datafixers-core:0.5.0' } ``` @@ -132,8 +132,8 @@ With JSON support: ```groovy dependencies { - implementation 'de.splatgames.aether:aether-datafixers-core:0.4.0' - implementation 'de.splatgames.aether:aether-datafixers-codec:0.4.0' + implementation 'de.splatgames.aether:aether-datafixers-core:0.5.0' + implementation 'de.splatgames.aether:aether-datafixers-codec:0.5.0' implementation 'com.google.code.gson:gson:2.13.2' } ``` @@ -142,7 +142,7 @@ dependencies { ```kotlin dependencies { - implementation("de.splatgames.aether:aether-datafixers-core:0.4.0") + implementation("de.splatgames.aether:aether-datafixers-core:0.5.0") } ``` @@ -150,8 +150,8 @@ With JSON support: ```kotlin dependencies { - implementation("de.splatgames.aether:aether-datafixers-core:0.4.0") - implementation("de.splatgames.aether:aether-datafixers-codec:0.4.0") + implementation("de.splatgames.aether:aether-datafixers-core:0.5.0") + implementation("de.splatgames.aether:aether-datafixers-codec:0.5.0") implementation("com.google.code.gson:gson:2.13.2") } ``` @@ -160,9 +160,9 @@ dependencies { ```groovy dependencies { - implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.4.0' - implementation 'de.splatgames.aether.datafixers:aether-datafixers-codec:0.4.0' - testImplementation 'de.splatgames.aether.datafixers:aether-datafixers-testkit:0.4.0' + implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.5.0' + implementation 'de.splatgames.aether.datafixers:aether-datafixers-codec:0.5.0' + testImplementation 'de.splatgames.aether.datafixers:aether-datafixers-testkit:0.5.0' } ``` @@ -172,7 +172,7 @@ dependencies { ```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' @@ -185,7 +185,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") diff --git a/docs/tutorials/basic-migration.md b/docs/tutorials/basic-migration.md index b85e690..ef70b98 100644 --- a/docs/tutorials/basic-migration.md +++ b/docs/tutorials/basic-migration.md @@ -30,12 +30,12 @@ Add the dependencies to your project: de.splatgames.aether aether-datafixers-core - 0.4.0 + 0.5.0 de.splatgames.aether aether-datafixers-codec - 0.4.0 + 0.5.0 com.google.code.gson