Implements a pure, algebraic, fully serializable migration system for ZIO Schema 2 as specified in #519. The system represents structural transformations between schema versions as first-class, serializable data.
DynamicMigration — Untyped, serializable execution engine operating on DynamicValueMigration[A, B] — Typed wrapper with source/target schemas providing A -> toDynamicValue -> DynamicMigration.apply -> fromDynamicValue -> BMigrationAction — Sealed trait ADT with 14 path-based action types via DynamicOpticMigrationBuilder[A, B] — Fluent builder with macro-extracted selector expressions (_.address.street)SchemaShape — Symbolic execution engine for .build() validation at every nesting levelMigrationSchemas — Hand-written Schema instances for full serialization of all migration typesMigrationMetadata — ID, description, timestamp, author, SHA-256 fingerprint for auditingRecord: AddField, DropField, Rename, TransformValue, Mandate, Optionalize, ChangeType, Join, Split
Enum: RenameCase, TransformCase
Collection: TransformElements, TransformKeys, TransformValues
SchemaExpr for value-level transformations as specified — no custom expression languagelossy: Boolean and reverse: Option[MigrationAction]DynamicMigration.validate() with configurable limits (maxActions, maxOpticDepth, maxNestingDepth, maxTotalNodes) for untrusted migrationsDynamicOptic paths in Join/Split (supports nested joins, not just root-level field names)blackbox.Context) and Scala 3 (scala.quoted) with 11 selector-based builder methods eachDynamicMigration fully serializable (MigrationSchemas with round-trip tests)Migration[A, B] wraps schemas and actionsDynamicOpticS => A) for optics on old and new types.build() — SchemaShape symbolic execution confirms source transforms to target.buildPartial() supportedSource (10 files):
DynamicMigration.scala — Execution engine with security validationMigration.scala — Typed wrapper with ++, andThen, composeStrict, reverseMigrationAction.scala — 14 sealed action types with reverse/lossy trackingMigrationBuilder.scala — Fluent builder with build(), buildPartial(), dryRun()MigrationError.scala — Rich error type with path and diagnostic contextMigrationMetadata.scala — Auditing metadata with SHA-256 fingerprintMigrationSchemas.scala — Self-describing schemas for serializationSchemaShape.scala — Symbolic execution engine for validationMigrationBuilderMacros.scala (scala-2) — Scala 2 selector macrosMigrationBuilderMacros.scala (scala-3) — Scala 3 selector macrosTests (7 files, 182 tests):
DynamicMigrationSpec.scala — All action execution, composition, reverse, lossy, validate, explainMigrationBuilderSpec.scala — Builder API, build/buildPartial validation, metadata, dryRunMigrationLawsSpec.scala — Identity, associativity, reverse, composition lawsSchemaShapeSpec.scala — Shape extraction, comparison, symbolic action applicationMigrationCoverageSpec.scala — Branch coverage: ChangeType, TransformCase, collection ops, Join/Split, error paths, serialization round-trips, mixed-action compositionMigrationSelectorSpec.scala (Scala 3 only) — Macro selector-to-optic conversion/claim #519
CreativeSteward
@AtlasPA
ZIO
@ZIO