https://github.com/petitviolet/scala-generic-diff
extract objects' diff generically
https://github.com/petitviolet/scala-generic-diff
generic-programming metaprogramming scala shapeless
Last synced: 10 months ago
JSON representation
extract objects' diff generically
- Host: GitHub
- URL: https://github.com/petitviolet/scala-generic-diff
- Owner: petitviolet
- License: apache-2.0
- Created: 2018-12-06T15:50:35.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2020-01-04T14:22:01.000Z (about 6 years ago)
- Last Synced: 2023-07-05T12:09:19.217Z (over 2 years ago)
- Topics: generic-programming, metaprogramming, scala, shapeless
- Language: Scala
- Homepage:
- Size: 35.2 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Extract diff between objects
[](https://maven-badges.herokuapp.com/maven-central/net.petitviolet/generic-diff_2.12)
[](https://circleci.com/gh/petitviolet/scala-generic-diff)
[](https://coveralls.io/github/petitviolet/scala-generic-diff?branch=master)
A Scala library to extract differences between two objects.
This makes easy finding out what changes are applied on the old object.
Quick example:
```scala
// Using Ammonite-REPL
@ import $ivy.`net.petitviolet::generic-diff:`
@ import net.petitviolet.generic.diff._
...
@ case class User(id: Long, name: String)
defined class User
@ User(1L, "alice") diff User(1L, "bob")
res2: DiffResult[User] = DiffResult(List(FieldSame("id", 1L), FieldDiff("name", "alice", "bob")))
```
## Getting Started
```scala
libraryDependencies += "net.petitviolet" %% "generic-diff" % ""
```
## Example
```scala
import net.petitviolet.generic.diff._
case class User(id: Long, name: String, age: Int)
case class GroupName(value: String)
case class Group(id: Long, name: GroupName)
def main(args: Array[String]): Unit = {
// extract difference between 2 objects
val userDiff = User(1L, "alice", 20) diff User(2L, "alice", 35)
// result contains sequence of FieldDiff and FieldSame
assert(userDiff.fields == List(FieldDiff("id", 1, 2), FieldSame("name", "alice"), FieldDiff("age", 20, 35)))
// dynamic field access
assert(userDiff.name == FieldSame("name", "alice"))
assert(userDiff.age == FieldDiff("age", 20, 35))
// userDiff.foo // compile error!
// extract diff from nested objects
val groupDiff = Group(1, GroupName("tech")) diff Group(2L, GroupName("hoge"))
assert(
groupDiff.fields == List(
FieldDiff("id", 1, 2),
FieldDiff("name", GroupName("tech"), GroupName("hoge"))
)
)
}
```
## Publish
```console
sbt 'project genericDiffMacro' +publishSigned sonatypeReleaseAll \
'project genericDiff' +publishSigned sonatypeReleaseAll
```
## LICENSE
[Apache-2.0](https://github.com/petitviolet/scala-generic-diff/blob/master/LICENSE)