1- # Aether Datafixers v0.2.0 — Testkit, Extended Rules, Diagnostics, and Performance
1+ # 🚀 ** Aether Datafixers v0.2.0 — Testkit, Extended Rules, Diagnostics, and Performance**
22
33Extended rules, testkit module, migration diagnostics, and high-performance APIs.
44
55---
66
7- ## Highlights in v0.2.0
7+ ## 🎯 Highlights in v0.2.0
88
9- - ** Testkit Module** — New ` aether-datafixers-testkit ` module with fluent test data builders, custom AssertJ assertions, and test harnesses for DataFix, Schema, and migration testing.
10- - ** Extended Rewrite Rules** — Convenience methods for batch operations, field grouping/flattening, path-based operations, and conditional rules.
11- - ** Migration Diagnostics** — Opt-in diagnostic system for structured reports with timing, snapshots, and warnings.
12- - ** High-Performance APIs** — Batch transformations and single-pass conditionals for optimized migrations.
13- - ** Performance Optimizations** — Internal improvements with memoized path parsing, pre-allocated lists, and reduced allocations.
9+ - ✅ ** Testkit Module** — New ` aether-datafixers-testkit ` module with fluent test data builders, custom AssertJ assertions, and test harnesses for DataFix, Schema, and migration testing.
10+ - ✅ ** Extended Rewrite Rules** — Convenience methods for batch operations, field grouping/flattening, path-based operations, and conditional rules.
11+ - ✅ ** Migration Diagnostics** — Opt-in diagnostic system for structured reports with timing, snapshots, and warnings.
12+ - ✅ ** High-Performance APIs** — Batch transformations and single-pass conditionals for optimized migrations.
13+ - ✅ ** Performance Optimizations** — Internal improvements with memoized path parsing, pre-allocated lists, and reduced allocations.
1414
1515---
1616
17- ## Installation
17+ ## 📦 Installation
1818
1919> [ !TIP]
2020> All Aether artifacts are available on ** Maven Central** — no extra repository required.
@@ -23,72 +23,72 @@ Extended rules, testkit module, migration diagnostics, and high-performance APIs
2323
2424``` xml
2525<dependency >
26- <groupId >de.splatgames.aether.datafixers</groupId >
27- <artifactId >aether-datafixers-core</artifactId >
28- <version >0.2.0</version >
26+ <groupId >de.splatgames.aether.datafixers</groupId >
27+ <artifactId >aether-datafixers-core</artifactId >
28+ <version >0.2.0</version >
2929</dependency >
3030```
3131
3232** Using the BOM**
3333
3434``` xml
3535<dependencyManagement >
36- <dependencies >
37- <dependency >
38- <groupId >de.splatgames.aether.datafixers</groupId >
39- <artifactId >aether-datafixers-bom</artifactId >
40- <version >0.2.0</version >
41- <type >pom</type >
42- <scope >import</scope >
43- </dependency >
44- </dependencies >
36+ <dependencies >
37+ <dependency >
38+ <groupId >de.splatgames.aether.datafixers</groupId >
39+ <artifactId >aether-datafixers-bom</artifactId >
40+ <version >0.2.0</version >
41+ <type >pom</type >
42+ <scope >import</scope >
43+ </dependency >
44+ </dependencies >
4545</dependencyManagement >
4646
4747<dependencies >
48- <!-- No version needed -->
49- <dependency >
50- <groupId >de.splatgames.aether.datafixers</groupId >
51- <artifactId >aether-datafixers-core</artifactId >
52- </dependency >
48+ <!-- No version needed -->
49+ <dependency >
50+ <groupId >de.splatgames.aether.datafixers</groupId >
51+ <artifactId >aether-datafixers-core</artifactId >
52+ </dependency >
5353</dependencies >
5454```
5555
5656### Gradle (Groovy)
5757
5858``` groovy
5959dependencies {
60- implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.2.0'
61- // Or with BOM:
62- implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.2.0')
63- implementation 'de.splatgames.aether.datafixers:aether-datafixers-core'
60+ implementation 'de.splatgames.aether.datafixers:aether-datafixers-core:0.2.0'
61+ // Or with BOM:
62+ implementation platform('de.splatgames.aether.datafixers:aether-datafixers-bom:0.2.0')
63+ implementation 'de.splatgames.aether.datafixers:aether-datafixers-core'
6464}
6565```
6666
6767### Gradle (Kotlin)
6868
6969``` kotlin
7070dependencies {
71- implementation(" de.splatgames.aether.datafixers:aether-datafixers-core:0.2.0" )
72- // Or with BOM:
73- implementation(platform(" de.splatgames.aether.datafixers:aether-datafixers-bom:0.2.0" ))
74- implementation(" de.splatgames.aether.datafixers:aether-datafixers-core" )
71+ implementation(" de.splatgames.aether.datafixers:aether-datafixers-core:0.2.0" )
72+ // Or with BOM:
73+ implementation(platform(" de.splatgames.aether.datafixers:aether-datafixers-bom:0.2.0" ))
74+ implementation(" de.splatgames.aether.datafixers:aether-datafixers-core" )
7575}
7676```
7777
7878---
7979
80- ## What's New
80+ ## 🆕 What's New
8181
82- ### Testkit Module
82+ ### 🧪 Testkit Module
8383
8484New module ` aether-datafixers-testkit ` for testing migrations:
8585
8686``` xml
8787<dependency >
88- <groupId >de.splatgames.aether.datafixers</groupId >
89- <artifactId >aether-datafixers-testkit</artifactId >
90- <version >0.2.0</version >
91- <scope >test</scope >
88+ <groupId >de.splatgames.aether.datafixers</groupId >
89+ <artifactId >aether-datafixers-testkit</artifactId >
90+ <version >0.2.0</version >
91+ <scope >test</scope >
9292</dependency >
9393```
9494
@@ -106,9 +106,9 @@ New module `aether-datafixers-testkit` for testing migrations:
106106``` java
107107// Create test data fluently
108108Dynamic<JsonElement > input = TestData . gson(). object()
109- .put(" name" , " Alice" )
110- .put(" level" , 10 )
111- .build();
109+ .put(" name" , " Alice" )
110+ .put(" level" , 10 )
111+ .build();
112112
113113// Test a DataFix
114114DataFixTester . forFix(myFix)
@@ -126,7 +126,7 @@ MigrationTester.forFixer(myFixer)
126126 .verify();
127127```
128128
129- ### Extended Rewrite Rules
129+ ### 📐 Extended Rewrite Rules
130130
131131New convenience methods in ` Rules ` class:
132132
@@ -151,13 +151,13 @@ New convenience methods in `Rules` class:
151151** Example:**
152152``` java
153153Rules . seq(
154- Rules . renameFields(ops, Map . of(" playerName" , " name" , " xp" , " experience" )),
155- Rules . groupFields(ops, " position" , " x" , " y" , " z" ),
154+ Rules . renameFields(ops, Map . of(" playerName" , " name" , " xp" , " experience" )),
155+ Rules . groupFields(ops, " position" , " x" , " y" , " z" ),
156156 Rules . ifFieldMissing(ops, " version" , Rules . setField(ops, " version" , d - > d. createInt(1 )))
157- )
157+ )
158158```
159159
160- ### Migration Diagnostics
160+ ### 📊 Migration Diagnostics
161161
162162New opt-in diagnostic system for capturing structured reports:
163163
@@ -176,28 +176,28 @@ New opt-in diagnostic system for capturing structured reports:
176176- ` DiagnosticOptions.defaults() ` — Full diagnostics with snapshots and rule details
177177- ` DiagnosticOptions.minimal() ` — Timing only, minimal overhead
178178
179- ### High-Performance APIs
179+ ### ⚡ High-Performance APIs
180180
181181** BatchTransform:**
182182``` java
183183Rules . batch(ops, batch - > batch
184- .rename(" oldName" , " newName" )
184+ .rename(" oldName" , " newName" )
185185 .remove(" deprecated" )
186186 .set(" version" , d - > d. createInt(2 ))
187- .transform(" count" , d - > d. createInt(d. asInt(0 ) + 1 ))
188- .addIfMissing(" created" , d - > d. createLong(System . currentTimeMillis()))
189- )
187+ .transform(" count" , d - > d. createInt(d. asInt(0 ) + 1 ))
188+ .addIfMissing(" created" , d - > d. createLong(System . currentTimeMillis()))
189+ )
190190```
191191
192192** Single-Pass Conditionals:**
193193``` java
194194Rules . conditionalTransform(ops,
195- d - > d. get(" type" ). asString(" " ). equals(" legacy" ),
196- d - > d. set(" migrated" , d. createBoolean(true ))
197- )
195+ d - > d. get(" type" ). asString(" " ). equals(" legacy" ),
196+ d - > d. set(" migrated" , d. createBoolean(true ))
197+ )
198198```
199199
200- ### Performance Optimizations
200+ ### 🚀 Performance Optimizations
201201
202202Internal optimizations with no API changes:
203203- Path parsing uses character-based parsing with memoization cache
@@ -207,7 +207,7 @@ Internal optimizations with no API changes:
207207
208208---
209209
210- ## Changelog
210+ ## 📝 Changelog
211211
212212** New in 0.2.0**
213213
@@ -223,20 +223,25 @@ Internal optimizations with no API changes:
223223
224224---
225225
226- ## Roadmap (next)
226+ ## 🗺️ Roadmap (next)
227+
228+ - ** v0.3.0**
229+ - ** CLI module** — Migrate files and print/export a migration report (batch-friendly)
230+ - ** Schema tooling** — Runtime schema validation + diff utilities between versions
227231
228- - ** 0.3.x **
229- - Additional codec implementations
230- - Schema validation enhancements
231- - Migration dry-run mode
232+ - ** v0.4.0 **
233+ - ** Spring Boot integration ** — Auto-configuration for DataFixer in Spring apps
234+ - ** Extra ops modules ** — Optional YAML/TOML support (format adapters)
235+ - ** Debug utilities ** — Pretty printers / tree diff for Dynamic structures (dev-facing)
232236
233- - ** 1.0.x**
234- - Stable API surface
235- - Comprehensive documentation
236- - Production-ready release
237+ - ** v0.5.0** (API freeze candidate)
238+ - ** API stabilization pass** — Naming/packaging cleanup + deprecations completed
239+ - ** Compatibility checks in CI** — Binary/source compatibility guardrails for public API
240+ - ** Hardened error model** — Consistent exception types + structured error details
241+ - ** Release readiness** — Final review of docs/examples against frozen API
237242
238243---
239244
240- ## License
245+ ## 📜 License
241246
242247** MIT** — see ` LICENSE ` .
0 commit comments