output¶
diffx
does its best to show the difference in the most readable way, but obviously the default configuration won’t
cover all the use-cases. Because of that, there are few ways how you can modify its output.
intellij idea¶
If you are running tests using IntelliJ IDEA’s test runner, you will want to turn off the red text coloring it uses for test failure outputs because it interferes with difflicious’ color outputs.
In File | Settings | Editor | Color Scheme | Console Colors | Console | Error Output, uncheck the red foreground color. (Solution provided by Jacob Wang @jatcwang)
colors & signs¶
Diffx refers to the values that are compared as left
and right
, but you can think of them as actual
and expected
.
By default, the difference is shown in the following form:
leftColor(leftValue) -> rightColor(rightValue)
When comparing collection types the difference is calculated against the right
value
additionalColor(additionalValue)
when there is an additional entity on the left-hand side
missingColor(missingValue)
when there is a missing entity on the left-hand side
Colors can be customized providing an implicit instance of ShowConfig
class.
In fact rightColor
and leftColor
are functions string => string
so they can be modified to do whatever you want with the output.
One example of that would be to use some special characters instead of colors, which might be useful on some environments like e.g. CI.
val showConfigWithPlusMinus: ShowConfig =
ShowConfig.default.copy(default = identity, arrow = identity, right = s => "+" + s, left = s => "-" + s)
There are two predefined set of colors - light and dark theme.
The default theme is dark, and it can be changed using environment variable - DIFFX_COLOR_THEME
(light
/dark
).
skipping identical¶
In some cases it might be desired to skip rendering identical fields.
This can be achieved by using a specific DiffResult transformer. DiffResult transformer is a part of ShowConfig
.
By default, it is set to an identical function.
implicit val showConfig = ShowConfig.default.copy(transformer = DiffResultTransformer.skipIdentical)
// showConfig: ShowConfig = ShowConfig(
// left = com.softwaremill.diffx.ShowConfig$$$Lambda$11597/0x0000000842d62840@4292838c,
// right = com.softwaremill.diffx.ShowConfig$$$Lambda$11597/0x0000000842d62840@7e50258,
// missing = com.softwaremill.diffx.ShowConfig$$$Lambda$11597/0x0000000842d62840@5a59b1a9,
// additional = com.softwaremill.diffx.ShowConfig$$$Lambda$11597/0x0000000842d62840@352a9ee1,
// default = com.softwaremill.diffx.ShowConfig$$$Lambda$11600/0x0000000842d61840@6372f52b,
// arrow = com.softwaremill.diffx.ShowConfig$$$Lambda$11597/0x0000000842d62840@4c2adcdf,
// transformer = com.softwaremill.diffx.DiffResultTransformer$$$Lambda$11636/0x0000000842d02840@5b69f80a
// )
case class Person(name:String, age:Int)
val result = compare(Person("Bob", 23), Person("Alice", 23))
// result: DiffResult = DiffResultObject(
// name = "Person",
// fields = ListMap(
// "name" -> DiffResultString(
// diffs = List(
// DiffResultStringLine(
// diffs = List(DiffResultValue(left = "Bob", right = "Alice"))
// )
// )
// ),
// "age" -> IdenticalValue(value = 23)
// )
// )
result.show()
// res1: String = """Person(
// name: Bob -> Alice)"""
There is a convenient method in ShowConfig
called skipIdentical
which does exactly that, so the relevant line from
the example can be shortened to ShowConfig.default.skipIdentical