KAudit — ejemplos ejecutables¶
El módulo kaudit-samples
contiene ejemplos que compilan y corren de verdad, con las dos variantes en un solo módulo:
src/main/kotlin→ variante Kotlin (KSP).src/main/java→ variante Java (APT).
./gradlew :kaudit-samples:run
Un mismo dominio (Account con owner anidado, miembros por @AuditKey, settings en Map,
apiKey sensible) se audita en ambos lenguajes; la salida muestra el changelog legible y el
JSON serializado.
Kotlin (KSP)¶
@Auditable
data class Account(
val id: Long,
val name: String,
@Sensitive val apiKey: String,
@AuditIgnore val updatedAt: Long,
val owner: Person,
val members: List<Member>, // @AuditKey en Member.id → diff por clave
val settings: Map<String, String>,
)
val changes = old.diff(new)
println(changes.renderText())
// ~ name: Acme -> Acme Inc
// ~ apiKey: (redactado)
// ~ owner.email: a@acme.com -> b@acme.com
// ~ members[1].role: viewer -> owner
// + members[3]: Member(id=3, role=guest)
// - settings[lang]: es
// ~ settings[theme]: light -> dark
// + settings[tz]: UTC
Persistir la traza como JSON (módulo kaudit-serialization):
val json = Json.encodeToString(changes.toRecords())
Java (APT)¶
var old = new Account(1, "Acme", "sk-AAA", 1_000,
new Person("a@acme.com"),
List.of(new Member(1, "viewer"), new Member(2, "admin")),
Map.of("theme", "light", "lang", "es"));
var neu = new Account(1, "Acme Inc", "sk-BBB", 9_999,
new Person("b@acme.com"),
List.of(new Member(2, "admin"), new Member(1, "owner"), new Member(3, "guest")),
Map.of("theme", "dark", "tz", "UTC"));
List<FieldChange> changes = AccountAuditor.diff(old, neu);
for (FieldChange c : changes) { /* getPath(), getOld(), getNew(), getKind(), getRedacted() */ }
Produce exactamente los mismos cambios (mismo path, misma redacción, mismo ChangeKind) que
la variante Kotlin: es el mismo dominio bajo dos frontends.