difftastic
difftastic copied to clipboard
Add output as JSON
Resolves #73
This adds the ability to output the diff as JSON instead of text for both file and directory diffs. The individual token changes are all grouped by lines with left- and right-hand sides to preserve syntax awareness and make it clear which lines were changed.
Example outputs:
difft sample_files/json_before.json sample_files/json_after.json
{
"language": "JSON",
"path": "sample_files/json_after.json",
"chunks": [
[
{
"lhs": {
"number": 2,
"changes": [
{
"start": 2,
"end": 7,
"content": "\"bar\"",
"kind": "keyword"
}
]
},
"rhs": {
"number": 2,
"changes": [
{
"start": 2,
"end": 7,
"content": "\"zab\"",
"kind": "keyword"
},
{
"start": 18,
"end": 19,
"content": ",",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 3,
"changes": [
{
"start": 2,
"end": 7,
"content": "\"woo\"",
"kind": "keyword"
},
{
"start": 7,
"end": 8,
"content": ":",
"kind": "normal"
},
{
"start": 9,
"end": 10,
"content": "[",
"kind": "delimiter"
},
{
"start": 10,
"end": 18,
"content": "\"foobar\"",
"kind": "string"
},
{
"start": 18,
"end": 19,
"content": "]",
"kind": "delimiter"
}
]
}
},
{
"lhs": {
"number": 1,
"changes": [
{
"start": 10,
"end": 11,
"content": "1",
"kind": "normal"
},
{
"start": 11,
"end": 12,
"content": ",",
"kind": "normal"
}
]
},
"rhs": {
"number": 1,
"changes": [
{
"start": 17,
"end": 18,
"content": ",",
"kind": "normal"
},
{
"start": 19,
"end": 20,
"content": "5",
"kind": "normal"
}
]
}
}
]
],
"status": "changed"
}
difft sample_files/javascript_before.js sample_files/javascript_after.js
{
"language": "JavaScript",
"path": "sample_files/javascript_after.js",
"chunks": [
[
{
"lhs": {
"number": 9,
"changes": [
{
"start": 7,
"end": 22,
"content": "\"Editing pages\"",
"kind": "string"
}
]
},
"rhs": {
"number": 9,
"changes": [
{
"start": 7,
"end": 18,
"content": "\"/edit GET\"",
"kind": "string"
}
]
}
}
],
[
{
"rhs": {
"number": 24,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 13,
"content": "type",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 20,
"content": "\"form\"",
"kind": "string"
},
{
"start": 20,
"end": 21,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 28,
"changes": [
{
"start": 10,
"end": 16,
"content": "expect",
"kind": "normal"
},
{
"start": 16,
"end": 17,
"content": "(",
"kind": "delimiter"
},
{
"start": 17,
"end": 20,
"content": "res",
"kind": "normal"
},
{
"start": 20,
"end": 21,
"content": ".",
"kind": "normal"
},
{
"start": 21,
"end": 28,
"content": "headers",
"kind": "normal"
},
{
"start": 28,
"end": 29,
"content": "[",
"kind": "delimiter"
},
{
"start": 29,
"end": 47,
"content": "\"www-authenticate\"",
"kind": "string"
},
{
"start": 47,
"end": 48,
"content": "]",
"kind": "delimiter"
},
{
"start": 48,
"end": 49,
"content": ")",
"kind": "delimiter"
},
{
"start": 49,
"end": 50,
"content": ".",
"kind": "normal"
},
{
"start": 50,
"end": 54,
"content": "toBe",
"kind": "normal"
},
{
"start": 54,
"end": 55,
"content": "(",
"kind": "delimiter"
},
{
"start": 55,
"end": 62,
"content": "\"Basic\"",
"kind": "string"
},
{
"start": 62,
"end": 63,
"content": ")",
"kind": "delimiter"
},
{
"start": 63,
"end": 64,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 30,
"changes": [
{
"start": 8,
"end": 9,
"content": "}",
"kind": "delimiter"
},
{
"start": 9,
"end": 10,
"content": ")",
"kind": "delimiter"
},
{
"start": 10,
"end": 11,
"content": ";",
"kind": "normal"
}
]
}
},
{
"lhs": {
"number": 19,
"changes": [
{
"start": 7,
"end": 23,
"content": "\"Creating pages\"",
"kind": "string"
}
]
},
"rhs": {
"number": 34,
"changes": [
{
"start": 7,
"end": 17,
"content": "\"/new GET\"",
"kind": "string"
}
]
}
},
{
"rhs": {
"number": 31,
"changes": [
{
"start": 4,
"end": 5,
"content": "}",
"kind": "delimiter"
},
{
"start": 5,
"end": 6,
"content": ")",
"kind": "delimiter"
},
{
"start": 6,
"end": 7,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 23,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 13,
"content": "post",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 22,
"content": "\"/edit/\"",
"kind": "string"
},
{
"start": 23,
"end": 24,
"content": "+",
"kind": "keyword"
},
{
"start": 25,
"end": 29,
"content": "page",
"kind": "normal"
},
{
"start": 29,
"end": 30,
"content": ".",
"kind": "normal"
},
{
"start": 30,
"end": 35,
"content": "rowid",
"kind": "normal"
},
{
"start": 35,
"end": 36,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 19,
"changes": [
{
"start": 4,
"end": 6,
"content": "db",
"kind": "normal"
},
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 17,
"content": "createPage",
"kind": "normal"
},
{
"start": 17,
"end": 18,
"content": "(",
"kind": "delimiter"
},
{
"start": 18,
"end": 35,
"content": "\"EditAuthExample\"",
"kind": "string"
},
{
"start": 35,
"end": 36,
"content": ",",
"kind": "normal"
},
{
"start": 37,
"end": 46,
"content": "\"foo bar\"",
"kind": "string"
},
{
"start": 46,
"end": 47,
"content": ",",
"kind": "normal"
},
{
"start": 48,
"end": 49,
"content": "(",
"kind": "delimiter"
},
{
"start": 49,
"end": 52,
"content": "err",
"kind": "normal"
},
{
"start": 52,
"end": 53,
"content": ",",
"kind": "normal"
},
{
"start": 54,
"end": 58,
"content": "page",
"kind": "normal"
},
{
"start": 58,
"end": 59,
"content": ")",
"kind": "delimiter"
},
{
"start": 60,
"end": 62,
"content": "=>",
"kind": "keyword"
},
{
"start": 63,
"end": 64,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 29,
"changes": [
{
"start": 10,
"end": 14,
"content": "done",
"kind": "normal"
},
{
"start": 14,
"end": 15,
"content": "(",
"kind": "delimiter"
},
{
"start": 15,
"end": 16,
"content": ")",
"kind": "delimiter"
},
{
"start": 16,
"end": 17,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 22,
"changes": [
{
"start": 6,
"end": 13,
"content": "request",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 17,
"content": "app",
"kind": "normal"
},
{
"start": 17,
"end": 18,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 20,
"changes": [
{
"start": 6,
"end": 12,
"content": "expect",
"kind": "normal"
},
{
"start": 12,
"end": 13,
"content": "(",
"kind": "delimiter"
},
{
"start": 13,
"end": 16,
"content": "err",
"kind": "normal"
},
{
"start": 16,
"end": 17,
"content": ")",
"kind": "delimiter"
},
{
"start": 17,
"end": 18,
"content": ".",
"kind": "normal"
},
{
"start": 18,
"end": 26,
"content": "toBeNull",
"kind": "normal"
},
{
"start": 26,
"end": 27,
"content": "(",
"kind": "delimiter"
},
{
"start": 27,
"end": 28,
"content": ")",
"kind": "delimiter"
},
{
"start": 28,
"end": 29,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 25,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 13,
"content": "send",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 15,
"content": "{",
"kind": "delimiter"
},
{
"start": 16,
"end": 20,
"content": "name",
"kind": "normal"
},
{
"start": 20,
"end": 21,
"content": ":",
"kind": "normal"
},
{
"start": 22,
"end": 39,
"content": "\"EditPostExample\"",
"kind": "string"
},
{
"start": 39,
"end": 40,
"content": ",",
"kind": "normal"
},
{
"start": 41,
"end": 48,
"content": "content",
"kind": "normal"
},
{
"start": 48,
"end": 49,
"content": ":",
"kind": "normal"
},
{
"start": 50,
"end": 63,
"content": "\"hello world\"",
"kind": "string"
},
{
"start": 64,
"end": 65,
"content": "}",
"kind": "delimiter"
},
{
"start": 65,
"end": 66,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 26,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 13,
"content": "then",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 17,
"content": "res",
"kind": "normal"
},
{
"start": 18,
"end": 20,
"content": "=>",
"kind": "keyword"
},
{
"start": 21,
"end": 22,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"lhs": {
"number": 18,
"changes": []
},
"rhs": {
"number": 18,
"changes": [
{
"start": 2,
"end": 6,
"content": "test",
"kind": "normal"
},
{
"start": 6,
"end": 7,
"content": "(",
"kind": "delimiter"
},
{
"start": 7,
"end": 19,
"content": "\"/edit POST\"",
"kind": "string"
},
{
"start": 19,
"end": 20,
"content": ",",
"kind": "normal"
},
{
"start": 21,
"end": 25,
"content": "done",
"kind": "normal"
},
{
"start": 26,
"end": 28,
"content": "=>",
"kind": "keyword"
},
{
"start": 29,
"end": 30,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 27,
"changes": [
{
"start": 10,
"end": 16,
"content": "expect",
"kind": "normal"
},
{
"start": 16,
"end": 17,
"content": "(",
"kind": "delimiter"
},
{
"start": 17,
"end": 20,
"content": "res",
"kind": "normal"
},
{
"start": 20,
"end": 21,
"content": ".",
"kind": "normal"
},
{
"start": 21,
"end": 31,
"content": "statusCode",
"kind": "normal"
},
{
"start": 31,
"end": 32,
"content": ")",
"kind": "delimiter"
},
{
"start": 32,
"end": 33,
"content": ".",
"kind": "normal"
},
{
"start": 33,
"end": 37,
"content": "toBe",
"kind": "normal"
},
{
"start": 37,
"end": 38,
"content": "(",
"kind": "delimiter"
},
{
"start": 38,
"end": 41,
"content": "401",
"kind": "normal"
},
{
"start": 41,
"end": 42,
"content": ")",
"kind": "delimiter"
},
{
"start": 42,
"end": 43,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 32,
"changes": [
{
"start": 2,
"end": 3,
"content": "}",
"kind": "delimiter"
},
{
"start": 3,
"end": 4,
"content": ")",
"kind": "delimiter"
},
{
"start": 4,
"end": 5,
"content": ";",
"kind": "normal"
}
]
}
}
],
[
{
"rhs": {
"number": 44,
"changes": [
{
"start": 4,
"end": 11,
"content": "request",
"kind": "normal"
},
{
"start": 11,
"end": 12,
"content": "(",
"kind": "delimiter"
},
{
"start": 12,
"end": 15,
"content": "app",
"kind": "normal"
},
{
"start": 15,
"end": 16,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 45,
"changes": [
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 11,
"content": "post",
"kind": "normal"
},
{
"start": 11,
"end": 12,
"content": "(",
"kind": "delimiter"
},
{
"start": 12,
"end": 18,
"content": "\"/new\"",
"kind": "string"
},
{
"start": 18,
"end": 19,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 48,
"changes": [
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 13,
"content": "expect",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 17,
"content": "401",
"kind": "normal"
},
{
"start": 17,
"end": 18,
"content": ",",
"kind": "normal"
},
{
"start": 19,
"end": 23,
"content": "done",
"kind": "normal"
},
{
"start": 23,
"end": 24,
"content": ")",
"kind": "delimiter"
},
{
"start": 24,
"end": 25,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 49,
"changes": [
{
"start": 2,
"end": 3,
"content": "}",
"kind": "delimiter"
},
{
"start": 3,
"end": 4,
"content": ")",
"kind": "delimiter"
},
{
"start": 4,
"end": 5,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 43,
"changes": [
{
"start": 2,
"end": 6,
"content": "test",
"kind": "normal"
},
{
"start": 6,
"end": 7,
"content": "(",
"kind": "delimiter"
},
{
"start": 7,
"end": 18,
"content": "\"/new POST\"",
"kind": "string"
},
{
"start": 18,
"end": 19,
"content": ",",
"kind": "normal"
},
{
"start": 20,
"end": 24,
"content": "done",
"kind": "normal"
},
{
"start": 25,
"end": 27,
"content": "=>",
"kind": "keyword"
},
{
"start": 28,
"end": 29,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 46,
"changes": [
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 11,
"content": "type",
"kind": "normal"
},
{
"start": 11,
"end": 12,
"content": "(",
"kind": "delimiter"
},
{
"start": 12,
"end": 18,
"content": "\"form\"",
"kind": "string"
},
{
"start": 18,
"end": 19,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 47,
"changes": [
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 11,
"content": "send",
"kind": "normal"
},
{
"start": 11,
"end": 12,
"content": "(",
"kind": "delimiter"
},
{
"start": 12,
"end": 13,
"content": "{",
"kind": "delimiter"
},
{
"start": 14,
"end": 18,
"content": "name",
"kind": "normal"
},
{
"start": 18,
"end": 19,
"content": ":",
"kind": "normal"
},
{
"start": 20,
"end": 31,
"content": "\"FooBarBaz\"",
"kind": "string"
},
{
"start": 31,
"end": 32,
"content": ",",
"kind": "normal"
},
{
"start": 33,
"end": 40,
"content": "content",
"kind": "normal"
},
{
"start": 40,
"end": 41,
"content": ":",
"kind": "normal"
},
{
"start": 42,
"end": 55,
"content": "\"hello world\"",
"kind": "string"
},
{
"start": 56,
"end": 57,
"content": "}",
"kind": "delimiter"
},
{
"start": 57,
"end": 58,
"content": ")",
"kind": "delimiter"
}
]
}
}
],
[
{
"lhs": {
"number": 58,
"changes": [
{
"start": 7,
"end": 18,
"content": "\"/edit GET\"",
"kind": "string"
}
]
},
"rhs": {
"number": 80,
"changes": [
{
"start": 7,
"end": 19,
"content": "\"/edit POST\"",
"kind": "string"
}
]
}
}
],
[
{
"rhs": {
"number": 101,
"changes": [
{
"start": 2,
"end": 6,
"content": "test",
"kind": "normal"
},
{
"start": 6,
"end": 7,
"content": "(",
"kind": "delimiter"
},
{
"start": 7,
"end": 23,
"content": "\"/AnExamplePage\"",
"kind": "string"
},
{
"start": 23,
"end": 24,
"content": ",",
"kind": "normal"
},
{
"start": 25,
"end": 29,
"content": "done",
"kind": "normal"
},
{
"start": 30,
"end": 32,
"content": "=>",
"kind": "keyword"
},
{
"start": 33,
"end": 34,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 104,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 12,
"content": "get",
"kind": "normal"
},
{
"start": 12,
"end": 13,
"content": "(",
"kind": "delimiter"
},
{
"start": 13,
"end": 29,
"content": "\"/AnExamplePage\"",
"kind": "string"
},
{
"start": 29,
"end": 30,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 107,
"changes": [
{
"start": 2,
"end": 3,
"content": "}",
"kind": "delimiter"
},
{
"start": 3,
"end": 4,
"content": ")",
"kind": "delimiter"
},
{
"start": 4,
"end": 5,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 102,
"changes": [
{
"start": 4,
"end": 6,
"content": "db",
"kind": "normal"
},
{
"start": 6,
"end": 7,
"content": ".",
"kind": "normal"
},
{
"start": 7,
"end": 17,
"content": "createPage",
"kind": "normal"
},
{
"start": 17,
"end": 18,
"content": "(",
"kind": "delimiter"
},
{
"start": 18,
"end": 33,
"content": "\"AnExamplePage\"",
"kind": "string"
},
{
"start": 33,
"end": 34,
"content": ",",
"kind": "normal"
},
{
"start": 35,
"end": 44,
"content": "\"foo bar\"",
"kind": "string"
},
{
"start": 44,
"end": 45,
"content": ",",
"kind": "normal"
},
{
"start": 46,
"end": 47,
"content": "(",
"kind": "delimiter"
},
{
"start": 47,
"end": 48,
"content": ")",
"kind": "delimiter"
},
{
"start": 49,
"end": 51,
"content": "=>",
"kind": "keyword"
},
{
"start": 52,
"end": 53,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 94,
"changes": [
{
"start": 0,
"end": 8,
"content": "describe",
"kind": "normal"
},
{
"start": 8,
"end": 9,
"content": "(",
"kind": "delimiter"
},
{
"start": 9,
"end": 18,
"content": "\"Viewing\"",
"kind": "string"
},
{
"start": 18,
"end": 19,
"content": ",",
"kind": "normal"
},
{
"start": 20,
"end": 21,
"content": "(",
"kind": "delimiter"
},
{
"start": 21,
"end": 22,
"content": ")",
"kind": "delimiter"
},
{
"start": 23,
"end": 25,
"content": "=>",
"kind": "keyword"
},
{
"start": 26,
"end": 27,
"content": "{",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 106,
"changes": [
{
"start": 4,
"end": 5,
"content": "}",
"kind": "delimiter"
},
{
"start": 5,
"end": 6,
"content": ")",
"kind": "delimiter"
},
{
"start": 6,
"end": 7,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 103,
"changes": [
{
"start": 6,
"end": 13,
"content": "request",
"kind": "normal"
},
{
"start": 13,
"end": 14,
"content": "(",
"kind": "delimiter"
},
{
"start": 14,
"end": 17,
"content": "app",
"kind": "normal"
},
{
"start": 17,
"end": 18,
"content": ")",
"kind": "delimiter"
}
]
}
},
{
"rhs": {
"number": 108,
"changes": [
{
"start": 0,
"end": 1,
"content": "}",
"kind": "delimiter"
},
{
"start": 1,
"end": 2,
"content": ")",
"kind": "delimiter"
},
{
"start": 2,
"end": 3,
"content": ";",
"kind": "normal"
}
]
}
},
{
"rhs": {
"number": 105,
"changes": [
{
"start": 8,
"end": 9,
"content": ".",
"kind": "normal"
},
{
"start": 9,
"end": 15,
"content": "expect",
"kind": "normal"
},
{
"start": 15,
"end": 16,
"content": "(",
"kind": "delimiter"
},
{
"start": 16,
"end": 19,
"content": "200",
"kind": "normal"
},
{
"start": 19,
"end": 20,
"content": ",",
"kind": "normal"
},
{
"start": 21,
"end": 25,
"content": "done",
"kind": "normal"
},
{
"start": 25,
"end": 26,
"content": ")",
"kind": "delimiter"
},
{
"start": 26,
"end": 27,
"content": ";",
"kind": "normal"
}
]
}
}
]
],
"status": "changed"
}
Codecov Report
Patch coverage: 2.38
% and project coverage change: -12.55
:warning:
Comparison is base (
2934c08
) 83.10% compared to head (56dd5b3
) 70.55%.
:exclamation: Current head 56dd5b3 differs from pull request most recent head 5557459. Consider uploading reports for the commit 5557459 to get more accurate results
Additional details and impacted files
@@ Coverage Diff @@
## master #158 +/- ##
===========================================
- Coverage 83.10% 70.55% -12.55%
===========================================
Files 23 22 -1
Lines 9338 6776 -2562
===========================================
- Hits 7760 4781 -2979
- Misses 1578 1995 +417
Impacted Files | Coverage Ξ | |
---|---|---|
src/json.rs | 0.00% <0.00%> (ΓΈ) |
|
src/main.rs | 14.70% <0.00%> (-61.15%) |
:arrow_down: |
src/options.rs | 48.01% <71.42%> (-40.15%) |
:arrow_down: |
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.
This is a really neat PR! Do you have an expected use case in mind? (I only just learned about Difftastic and am curious about ways it could end up directly in the browser.)
This would allow integration with delta as described in this issue
I updated this PR by rebasing it on current master: https://github.com/withzombies/difftastic/tree/json
anything missing from this PR?
Up! @Wilfred is this PR dead?
@akrantz01 what is the status of this PR ? :)
Honestly not super sure, the project I had planned to use this for never really got started, so I no longer really have a use for it. However, I'm more than happy to rebase it to main
to get it pushed through.
I'm currently dealing with final exams for uni, but I'll be able to get to it after this weekend.
Cool, thanks for the update.
Sorry for the delay on reviewing this.
I was initially concerned about exposing internal details of difftastic types, which change pretty often. I see this is defining separate types, which largely solves that.
This should probably be --display=json
rather than a new CLI argument, kind
should be highlight
I think, and the number
field looks unnecessary, but the general approach looks good :)
No worries! I think my original intention for the number field was to specify the line number. If that makes sense to keep, I'll rename it to line_number
so it's more descriptive.
Just rebased to the latest master with the proposed changes
@Wilfred any updates on getting this reviewed and merged?
Hey @akrantz01 @Wilfred just wanted to see if we can resolve conflicts and get this merged :)
Merged in 11a96e5aec33c219ff786b2056b29c7057299e5a, thanks! :)
This is pretty much the same code, just rebased on master and squashed. I've made two small changes:
(1) This is a big increase in the exposed API to users, and I'm cautious about committing to this specific format. For now, I'm requiring DFT_UNSTABLE=yes
as an environment variable so we can collect feedback and tweak the format as needed.
(2) When diffing directories, difftastic will print the result of each file as soon as it's finished. This PR collected all the results and only printed at the end, so I've restored that behaviour.