Skip to content

Add output as JSON#158

Closed
akrantz01 wants to merge 5 commits into
Wilfred:masterfrom
akrantz01:json-output
Closed

Add output as JSON#158
akrantz01 wants to merge 5 commits into
Wilfred:masterfrom
akrantz01:json-output

Conversation

@akrantz01

Copy link
Copy Markdown
Contributor

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

codecov Bot commented Mar 13, 2022

Copy link
Copy Markdown

Codecov Report

Patch coverage: 2.38% and project coverage change: -12.55 ⚠️

Comparison is base (2934c08) 83.10% compared to head (56dd5b3) 70.55%.

❗ 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%) ⬇️
src/options.rs 48.01% <71.42%> (-40.15%) ⬇️

... and 34 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

@lvh

lvh commented Apr 3, 2022

Copy link
Copy Markdown

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.)

@oberblastmeister

Copy link
Copy Markdown

This would allow integration with delta as described in this issue

@withzombies

Copy link
Copy Markdown

I updated this PR by rebasing it on current master: https://github.com/withzombies/difftastic/tree/json

@xangelix

Copy link
Copy Markdown

anything missing from this PR?

@rawnly

rawnly commented Mar 20, 2023

Copy link
Copy Markdown

Up! @Wilfred is this PR dead?

@themarcel

Copy link
Copy Markdown

@akrantz01 what is the status of this PR ? :)

@akrantz01

Copy link
Copy Markdown
Contributor Author

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.

@themarcel

Copy link
Copy Markdown

Cool, thanks for the update.

@Wilfred

Wilfred commented Apr 20, 2023

Copy link
Copy Markdown
Owner

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 :)

@akrantz01

Copy link
Copy Markdown
Contributor Author

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.

@akrantz01

Copy link
Copy Markdown
Contributor Author

Just rebased to the latest master with the proposed changes

@akrantz01

Copy link
Copy Markdown
Contributor Author

@Wilfred any updates on getting this reviewed and merged?

@mds1

mds1 commented Jul 18, 2023

Copy link
Copy Markdown

Hey @akrantz01 @Wilfred just wanted to see if we can resolve conflicts and get this merged :)

@Wilfred

Wilfred commented Aug 17, 2023

Copy link
Copy Markdown
Owner

Merged in 11a96e5, 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: provide an output as json

9 participants